mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-26 22:22:16 +03:00
Расширяем модуль UART для обмена сообщениями с другими МК
This commit is contained in:
@@ -6,58 +6,143 @@
|
||||
#include "modules/sensors/UART/Uart.h"
|
||||
|
||||
#ifdef ESP8266
|
||||
SoftwareSerial* myUART = nullptr;
|
||||
SoftwareSerial* myUART = nullptr;
|
||||
#else
|
||||
HardwareSerial* myUART = nullptr;
|
||||
HardwareSerial* myUART = nullptr;
|
||||
#endif
|
||||
|
||||
class UART : public IoTItem {
|
||||
private:
|
||||
int tx;
|
||||
int rx;
|
||||
int speed;
|
||||
int _tx;
|
||||
int _rx;
|
||||
int _speed;
|
||||
int _eventFormat = 0; // 0 - нет приема, 1 - json IoTM, 2 - Nextion
|
||||
|
||||
#ifdef ESP8266
|
||||
SoftwareSerial* _myUART = nullptr;
|
||||
#else
|
||||
HardwareSerial* _myUART = nullptr;
|
||||
#endif
|
||||
|
||||
public:
|
||||
UART(String parameters) : IoTItem(parameters) {
|
||||
tx = jsonReadInt(parameters, "tx");
|
||||
rx = jsonReadInt(parameters, "rx");
|
||||
speed = jsonReadInt(parameters, "speed");
|
||||
jsonRead(parameters, "tx", _tx);
|
||||
jsonRead(parameters, "rx", _rx);
|
||||
jsonRead(parameters, "speed", _speed);
|
||||
jsonRead(parameters, "eventFormat", _eventFormat);
|
||||
|
||||
if (!myUART) {
|
||||
#ifdef ESP8266
|
||||
myUART = new SoftwareSerial(tx, rx);
|
||||
myUART->begin(speed);
|
||||
myUART = _myUART = new SoftwareSerial(_tx, _rx);
|
||||
_myUART->begin(_speed);
|
||||
#endif
|
||||
#ifdef ESP32
|
||||
myUART = new HardwareSerial(2);
|
||||
myUART->begin(speed, SERIAL_8N1, rx, tx);
|
||||
_myUART = new HardwareSerial(2);
|
||||
_myUART->begin(speed, SERIAL_8N1, rx, tx);
|
||||
#endif
|
||||
}
|
||||
|
||||
// проверяем формат и если событие, то регистрируем его
|
||||
void analyzeString(const String& msg) {
|
||||
switch (_eventFormat) {
|
||||
case 0: // не указан формат, значит все полученные данные воспринимаем как общее значение из UART
|
||||
setValue(msg);
|
||||
break;
|
||||
|
||||
case 1: // формат событий IoTM с использованием json, значит создаем временную копию
|
||||
analyzeMsgFromNet(msg);
|
||||
break;
|
||||
|
||||
case 2: // формат команд от Nextion ID=Value
|
||||
String id = selectToMarker(msg, "=");
|
||||
IoTItem *item = findIoTItem(id);
|
||||
if (!item) return;
|
||||
String valStr = selectToMarkerLast(msg, "=");
|
||||
valStr.replace("\"", "");
|
||||
item->setValue(valStr);
|
||||
break;
|
||||
}
|
||||
SerialPrint("i", F("UART"), F("UART Init"));
|
||||
}
|
||||
|
||||
void uartHandle() {
|
||||
if (myUART) {
|
||||
static String incStr;
|
||||
if (myUART->available()) {
|
||||
char inc;
|
||||
inc = myUART->read();
|
||||
incStr += inc;
|
||||
if (inc == '\n') {
|
||||
parse(incStr);
|
||||
incStr = "";
|
||||
}
|
||||
if (!_myUART) return;
|
||||
|
||||
if (_myUART->available()) {
|
||||
static String inStr = "";
|
||||
char inc;
|
||||
inc = _myUART->read();
|
||||
inStr += inc;
|
||||
if (inc == '\n') {
|
||||
analyzeString(inStr);
|
||||
inStr = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void parse(String& incStr) {
|
||||
SerialPrint("I", "=>UART", incStr);
|
||||
void onRegEvent(IoTItem* eventItem) {
|
||||
if (!_myUART) return;
|
||||
|
||||
String printStr = "";
|
||||
switch (_eventFormat) {
|
||||
case 0: return; // не указан формат, значит не следим за событиями
|
||||
case 1: // формат событий IoTM с использованием json
|
||||
eventItem->getNetEvent(printStr);
|
||||
_myUART->println(printStr);
|
||||
break;
|
||||
|
||||
case 2: // формат событий для Nextion ID=Value0xFF0xFF0xFF
|
||||
printStr += eventItem->getID();
|
||||
printStr += "=";
|
||||
if (eventItem->value.isDecimal)
|
||||
printStr += eventItem->value.valD;
|
||||
else {
|
||||
printStr += "\"";
|
||||
printStr += eventItem->value.valS;
|
||||
printStr += "\"";
|
||||
}
|
||||
_myUART->print(printStr);
|
||||
_myUART->write(0xff);
|
||||
_myUART->write(0xff);
|
||||
_myUART->write(0xff);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void uartPrint(String msg) {
|
||||
myUART->print(msg);
|
||||
virtual void loop() {
|
||||
uartHandle();
|
||||
}
|
||||
|
||||
void uartPrint(const String& msg) {
|
||||
if (_myUART) {
|
||||
_myUART->println(msg);
|
||||
}
|
||||
}
|
||||
|
||||
void 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 execute(String command, std::vector<IoTValue> ¶m) {
|
||||
if (command == "print") {
|
||||
if (param.size() == 1) {
|
||||
uartPrint(param[0].valS);
|
||||
}
|
||||
} else if (command == "printHex") {
|
||||
if (param.size() == 1) {
|
||||
uartPrintHex(param[0].valS);
|
||||
}
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
void* getAPI_UART(String subtype, String param) {
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
"menuSection": "Сенсоры",
|
||||
"configItem": [
|
||||
{
|
||||
"global": 0,
|
||||
"name": "UART",
|
||||
"type": "Reading",
|
||||
"subtype": "UART",
|
||||
@@ -12,7 +11,8 @@
|
||||
"id": "u",
|
||||
"tx": 12,
|
||||
"rx": 13,
|
||||
"speed": 9600
|
||||
"speed": 9600,
|
||||
"eventFormat": 0
|
||||
}
|
||||
],
|
||||
"about": {
|
||||
@@ -30,11 +30,12 @@
|
||||
"SoftUART"
|
||||
],
|
||||
"title": "Software uart для esp8266 или hardware uart для esp32",
|
||||
"moduleDesc": "Используется вместе с Pzem004t или с другими работающими по uart сенсорами, в последствии будет доработан для связи с arduino платами",
|
||||
"moduleDesc": "Используется вместе с Pzem004t или с другими работающими по uart сенсорами. Пригоден для обмена данными с другими контроллерами в ручном режиме или с автоматической трансляцией событий как по сети.",
|
||||
"propInfo": {
|
||||
"tx": "TX пин",
|
||||
"rx": "RX пин",
|
||||
"speed": "Скорость UART"
|
||||
"speed": "Скорость UART",
|
||||
"eventFormat": "Выбор формата обмена сообщениями с другими контроллерами. =0 - не указан формат, значит не следим за событиями, =1 - формат событий IoTM с использованием json, =2 - формат событий для Nextion отправка событий: ID=Value0xFF0xFF0xFF прием ордеров: ID=Value"
|
||||
}
|
||||
},
|
||||
"defActive": true,
|
||||
|
||||
Reference in New Issue
Block a user