mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-26 14:12:16 +03:00
Добавляем базовый класс для работы с Serial
This commit is contained in:
34
include/classes/IoTUart.h
Normal file
34
include/classes/IoTUart.h
Normal file
@@ -0,0 +1,34 @@
|
||||
#pragma once
|
||||
#include <Arduino.h>
|
||||
#include "classes/IoTItem.h"
|
||||
|
||||
#ifdef ESP8266
|
||||
#include <SoftwareSerial.h>
|
||||
#else
|
||||
#include <HardwareSerial.h>
|
||||
#endif
|
||||
|
||||
|
||||
class IoTUart : public IoTItem {
|
||||
public:
|
||||
IoTUart(const String& parameters);
|
||||
~IoTUart();
|
||||
|
||||
virtual void uartHandle();
|
||||
|
||||
virtual void loop();
|
||||
|
||||
void uartPrintStrInUTF16(const char *strUTF8, int length);
|
||||
void uartPrintln(const String& msg);
|
||||
void uartPrint(const String& msg);
|
||||
void uartPrintHex(const String& msg);
|
||||
virtual IoTValue execute(String command, std::vector<IoTValue> ¶m);
|
||||
|
||||
protected:
|
||||
#ifdef ESP8266
|
||||
SoftwareSerial* _myUART;
|
||||
#else
|
||||
HardwareSerial* _myUART;
|
||||
#endif
|
||||
|
||||
};
|
||||
100
src/classes/IoTUart.cpp
Normal file
100
src/classes/IoTUart.cpp
Normal file
@@ -0,0 +1,100 @@
|
||||
#include "Global.h"
|
||||
#include "classes/IoTUart.h"
|
||||
|
||||
|
||||
IoTUart::IoTUart(const String& parameters) : IoTItem(parameters) {
|
||||
int _tx, _rx, _speed, _line;
|
||||
jsonRead(parameters, "rx", _rx);
|
||||
jsonRead(parameters, "tx", _tx);
|
||||
jsonRead(parameters, "speed", _speed);
|
||||
jsonRead(parameters, "line", _line);
|
||||
|
||||
#ifdef ESP8266
|
||||
_myUART = new SoftwareSerial(_rx, _tx);
|
||||
_myUART->begin(_speed);
|
||||
#endif
|
||||
#ifdef ESP32
|
||||
_myUART = new HardwareSerial(_line);
|
||||
_myUART->begin(_speed, SERIAL_8N1, _rx, _tx);
|
||||
#endif
|
||||
}
|
||||
|
||||
void IoTUart::loop() {
|
||||
uartHandle();
|
||||
}
|
||||
|
||||
void IoTUart::uartHandle() {}
|
||||
|
||||
IoTUart::~IoTUart() {}
|
||||
|
||||
|
||||
void IoTUart::uartPrintStrInUTF16(const char *strUTF8, int length) {
|
||||
// очень жесткий но быстрый способ конвертирования UTF-8 в UTF-16, но с поддержкой только кириллицы и двух байт в UTF-8
|
||||
// не определяются исключения по формату UTF-8
|
||||
for (int i=0; i < length; i++) {
|
||||
if (strUTF8[i] < 176) { // если байт соответствует коду ASCII, значит берем как есть, но расширяем до двух байт
|
||||
_myUART->write(0x00);
|
||||
_myUART->write(strUTF8[i]);
|
||||
} else { // иначе понимаем, что имеем дело с двумя байтами (да UTF8 может иметь и больше, но это ограничение наше)
|
||||
_myUART->write(0x04); // указываем номер диапазона символов кириллицы первым байтом на выходе
|
||||
|
||||
if (strUTF8[i] == 208) { // если первый байт символа в первом диапазоне
|
||||
if (strUTF8[i+1] == 129) _myUART->write(0x01); // исключение для символа 'ё'
|
||||
else _myUART->write(strUTF8[i+1] - 128); // применяем смещение 128 и отправляем второй байт
|
||||
}
|
||||
|
||||
if (strUTF8[i] == 209) { // если первый байт символа во втором диапазоне
|
||||
if (strUTF8[i+1] == 145) _myUART->write(0x51); // исключение для символа 'Ё'
|
||||
else _myUART->write(strUTF8[i+1] - 64); // применяем смещение 64 и отправляем второй байт
|
||||
}
|
||||
|
||||
i++; // пропускаем второй байт входной строки
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void IoTUart::uartPrintln(const String& msg) {
|
||||
if (_myUART) {
|
||||
_myUART->println(msg);
|
||||
}
|
||||
}
|
||||
|
||||
void IoTUart::uartPrint(const String& msg) {
|
||||
if (_myUART) {
|
||||
_myUART->print(msg);
|
||||
}
|
||||
}
|
||||
|
||||
void IoTUart::uartPrintHex(const String& msg) {
|
||||
if (!_myUART) return;
|
||||
|
||||
unsigned char Hi, Lo;
|
||||
uint8_t byteTx;
|
||||
const char* strPtr = msg.c_str();
|
||||
while ((Hi = *strPtr++) && (Lo = *strPtr++)) {
|
||||
byteTx = (ChartoHex(Hi) << 4) | ChartoHex(Lo);
|
||||
_myUART->write(byteTx);
|
||||
}
|
||||
}
|
||||
|
||||
IoTValue IoTUart::execute(String command, std::vector<IoTValue> ¶m) {
|
||||
if (command == "println") {
|
||||
if (param.size() == 1) {
|
||||
//if (param[0].isDecimal) uartPrintln((String)param[0].valD);
|
||||
//else uartPrintln(param[0].valS);
|
||||
uartPrintln(param[0].valS);
|
||||
}
|
||||
} else if (command == "print") {
|
||||
if (param.size() == 1) {
|
||||
//if (param[0].isDecimal) uartPrint((String)param[0].valD);
|
||||
//else uartPrint(param[0].valS);
|
||||
uartPrintln(param[0].valS);
|
||||
}
|
||||
} else if (command == "printHex") {
|
||||
if (param.size() == 1) {
|
||||
uartPrintHex(param[0].valS);
|
||||
}
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
Reference in New Issue
Block a user