diff --git a/src/modules/sensors/UART/Uart.cpp b/src/modules/sensors/UART/Uart.cpp index 5428eecd..0ce8fd15 100644 --- a/src/modules/sensors/UART/Uart.cpp +++ b/src/modules/sensors/UART/Uart.cpp @@ -14,6 +14,10 @@ class UART : public IoTItem { private: int _eventFormat = 0; // 0 - нет приема, 1 - json IoTM, 2 - Nextion + char _inc; + String _inStr = ""; // буфер приема строк в режимах 0, 1, 2 + uint8_t _headerBuf[260]; // буфер для приема пакета dwin + int _headerIndex = 0; // счетчик принятых байт пакета #ifdef ESP8266 SoftwareSerial* _myUART = nullptr; @@ -70,23 +74,61 @@ class UART : public IoTItem { if (!_myUART) return; if (_myUART->available()) { - static String inStr = ""; - char inc; - - inc = _myUART->read(); - if (inc == 0xFF) { - inc = _myUART->read(); - inc = _myUART->read(); - inStr = ""; - return; - } + if (_eventFormat == 3) { // третий режим, значит ожидаем бинарный пакет данных от dwin + _headerBuf[_headerIndex] = _myUART->read(); - if (inc == '\r') return; - - if (inc == '\n') { - analyzeString(inStr); - inStr = ""; - } else inStr += inc; + // ищем валидный заголовок пакета dwin, проверяя каждый следующий байт + if (_headerIndex == 0 && _headerBuf[_headerIndex] != 0x5A || + _headerIndex == 1 && _headerBuf[_headerIndex] != 0xA5 || + _headerIndex == 2 && _headerBuf[_headerIndex] == 0 || + _headerIndex == 3 && _headerBuf[_headerIndex] == 0x82 ) { + _headerIndex = 0; + return; + } + + if (_headerIndex == _headerBuf[2] + 2) { // получили все данные из пакета + // Serial.print("ffffffff"); + // for (int i=0; i<=_headerIndex; i++) + // Serial.printf("%#x ", _headerBuf[i]); + // Serial.println("!!!"); + + String valStr, id = "_"; + if (_headerIndex == 8) { // предполагаем, что получили int16 + valStr = (String)((_headerBuf[7] << 8) | _headerBuf[8]); + } + + char buf[5]; + hex2string(_headerBuf + 4, 2, buf); + id += (String)buf; + + IoTItem* item = findIoTItemByPartOfName(id); + if (item) { + //Serial.printf("received data: %s for VP: %s for ID: %s\n", valStr, buf, item->getID()); + generateOrder(item->getID(), valStr); + } + + _headerIndex = 0; + return; + } + + _headerIndex++; + + } else { + _inc = _myUART->read(); + if (_inc == 0xFF) { + _inc = _myUART->read(); + _inc = _myUART->read(); + _inStr = ""; + return; + } + + if (_inc == '\r') return; + + if (_inc == '\n') { + analyzeString(_inStr); + _inStr = ""; + } else _inStr += _inc; + } } } @@ -161,7 +203,7 @@ class UART : public IoTItem { _myUART->write((eventItem->value.valS.length() - u16counter) * 2 + 5); // подсчитываем и отправляем размер итоговой строки + служебные байты _myUART->write(0x82); // требуем запись в память uartPrintHex(VP); // отправляем адрес в памяти VP - Serial.println("ffffff " + VP); + //Serial.println("ffffff " + VP); //_myUART->write(0x53); //_myUART->write(0x00); uartPrintStrInUTF16(eventItem->value.valS.c_str(), eventItem->value.valS.length()); // отправляем строку для записи