From c8cca84f7aea6ba990a0b294d8fa2f0919f8d0d4 Mon Sep 17 00:00:00 2001 From: Nikita Kozhuro Date: Wed, 30 Sep 2020 12:52:38 +0300 Subject: [PATCH] Added settings for serial port. Added the counter parameter in the UART Protocol When working with MinGW, sometimes data is read with 1 byte corruption. Additional settings should reduce the occurrence of this problem --- rf60Xcore/src/rf60X.c | 2 +- rf60Xcore/src/rf60X_sdk.c | 18 ++++++++--------- wrappers/Cpp/rf60Xsdk/rf60Xcore.cpp | 27 +++++++++++++++++++++++-- wrappers/Cpp/rf60Xsdk/rf60Xsdk.cpp | 31 +++++++++++++++++++---------- wrappers/Cpp/rf60Xsdk/rf60Xtypes.h | 1 + 5 files changed, 57 insertions(+), 22 deletions(-) diff --git a/rf60Xcore/src/rf60X.c b/rf60Xcore/src/rf60X.c index c0149e6..f4725cf 100644 --- a/rf60Xcore/src/rf60X.c +++ b/rf60Xcore/src/rf60X.c @@ -67,7 +67,7 @@ int rf60X_mutex_unlock() { rfBool rf60x_connect_udp(rf60x_t *scanner) { rfUint32 recv_addr = 0; rfUint32 recv_ip_addr; - recv_ip_addr = ((unsigned long int) 0x00000000); + recv_ip_addr = ((unsigned long int)0x00000000); scanner->m_data_sock = network_platform.network_methods.create_udp_socket(); if (scanner->m_data_sock != (void *)RF_SOCKET_ERROR) { int nret = 1; diff --git a/rf60Xcore/src/rf60X_sdk.c b/rf60Xcore/src/rf60X_sdk.c index 7344720..5aad3eb 100644 --- a/rf60Xcore/src/rf60X_sdk.c +++ b/rf60Xcore/src/rf60X_sdk.c @@ -213,18 +213,18 @@ rfUint8 send_command_modbus_rtu(scanner_base_t *device, rfUint8 recevice_modbus_rtu(scanner_base_t *device, rfUint8 count, rfUint16 *buffer) { - rfBool result; + rfBool result; - rfUint8 innerBuffer [255]; - result= rf60x_recevice_modbus_rtu(device->rf60x, count+5, (rfUint16*)innerBuffer); + rfUint8 innerBuffer[255]; + result = rf60x_recevice_modbus_rtu(device->rf60x, count + 5, + (rfUint16 *)innerBuffer); - if(result==-1) - return -1; - - for(rfUint8 i=0; iStopBits = ONESTOPBIT; // Setting StopBits = 1 old_valueDCB->Parity = EVENPARITY; // Setting Parity = None + if (!SetupComm(handleCOMPORT, 20000, 20000)) + { + fputs("Couldn't set serial port timeouts\n",stderr); + // return 0; + } + + SetCommState( handleCOMPORT, reinterpret_cast(old_valueDCB)); // TODO надо вынести в отдельную // функцию для я возможности настройки + + + + COMMTIMEOUTS newTO; + + newTO.ReadIntervalTimeout = 3*100; /* ms */ + newTO.ReadTotalTimeoutMultiplier = 0; + newTO.ReadTotalTimeoutConstant = 3*100; /* ms */ + newTO.WriteTotalTimeoutMultiplier = 0; + newTO.WriteTotalTimeoutConstant = 3*100; /* ms */ + + if (!SetCommTimeouts(handleCOMPORT, &newTO)) { + fputs("Couldn't set serial port timeouts\n",stderr); + // return 0; + } + // return 1; } rfSize platform_send_data_uart(void* handleCOMPORT, const void* buf, diff --git a/wrappers/Cpp/rf60Xsdk/rf60Xsdk.cpp b/wrappers/Cpp/rf60Xsdk/rf60Xsdk.cpp index de6b816..f8b77d6 100644 --- a/wrappers/Cpp/rf60Xsdk/rf60Xsdk.cpp +++ b/wrappers/Cpp/rf60Xsdk/rf60Xsdk.cpp @@ -197,6 +197,7 @@ void rf60x::close_port_uart() { } bool rf60x::get_measure_uart(void *measure) { + rfUint8 *measure_from_scanner_uart_ti = ::get_measure_uart( (scanner_base_t *)scanner_base); // FIXME исправить для различных // сканеров @@ -210,16 +211,26 @@ bool rf60x::get_measure_uart(void *measure) { switch (((scanner_base_t *)scanner_base)->type) { case 1: { - reinterpret_cast(measure)->value = - (measure_from_scanner_uart_ti[0] & 0x0F) | - (measure_from_scanner_uart_ti[1] & 0x0F) << 4 | - (measure_from_scanner_uart_ti[2] & 0x0F) << 8 | - (measure_from_scanner_uart_ti[3] & 0x0F) << 12; - reinterpret_cast(measure)->status = - (measure_from_scanner_uart_ti[0] & 0x40) >> 5; - - memory_platform.rf_free(measure_from_scanner_uart_ti); - break; + rfUint8 tempCNT=(measure_from_scanner_uart_ti[0] & 0x30)>> 4; + + if ((measure_from_scanner_uart_ti[1] & 0x30) >> 4 != tempCNT || + (measure_from_scanner_uart_ti[2] & 0x30) >> 4 != tempCNT || + (measure_from_scanner_uart_ti[3] & 0x30) >> 4 != tempCNT) + return false; + + reinterpret_cast(measure)->count = + tempCNT; + + reinterpret_cast(measure)->value = + (measure_from_scanner_uart_ti[0] & 0x0F) | + (measure_from_scanner_uart_ti[1] & 0x0F) << 4 | + (measure_from_scanner_uart_ti[2] & 0x0F) << 8 | + (measure_from_scanner_uart_ti[3] & 0x0F) << 12; + reinterpret_cast(measure)->status = + (measure_from_scanner_uart_ti[0] & 0x40) >> 5; + + memory_platform.rf_free(measure_from_scanner_uart_ti); + break; } case 2: { reinterpret_cast(measure)->value = diff --git a/wrappers/Cpp/rf60Xsdk/rf60Xtypes.h b/wrappers/Cpp/rf60Xsdk/rf60Xtypes.h index 6138f43..80c918d 100644 --- a/wrappers/Cpp/rf60Xsdk/rf60Xtypes.h +++ b/wrappers/Cpp/rf60Xsdk/rf60Xtypes.h @@ -26,6 +26,7 @@ typedef struct { typedef struct { uint16_t value; + uint8_t count; uint8_t status; uint8_t reserverd; } uart_stream_measure_t; -- GitLab