X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fmodbus%2Fmodbus_serial_rtu.c;h=f7fee0abafec655ef221a2df335705f7f619dfa3;hb=f9c3df65c11c521b0a89a62c9e4c007300843619;hp=437d187a7b8745fcd9b27fbfb7270961c59ddecd;hpb=4c938fc27f1679d5239133d2a821ab7f39a256de;p=libsigrok.git diff --git a/src/modbus/modbus_serial_rtu.c b/src/modbus/modbus_serial_rtu.c index 437d187a..f7fee0ab 100644 --- a/src/modbus/modbus_serial_rtu.c +++ b/src/modbus/modbus_serial_rtu.c @@ -17,15 +17,17 @@ * along with this program. If not, see . */ -#include "libsigrok.h" -#include "libsigrok-internal.h" - +#include #include #include #include +#include +#include "libsigrok-internal.h" #define LOG_PREFIX "modbus_serial" +#ifdef HAVE_SERIAL_COMM + #define BUFFER_SIZE 1024 struct modbus_serial_rtu { @@ -39,7 +41,7 @@ static int modbus_serial_rtu_dev_inst_new(void *priv, const char *resource, { struct modbus_serial_rtu *modbus = priv; - (void) params; + (void)params; modbus->serial = sr_serial_dev_inst_new(resource, serialcomm); modbus->slave_addr = modbusaddr; @@ -96,6 +98,7 @@ static uint16_t modbus_serial_rtu_crc(uint16_t crc, crc ^= 0xA001; } } + return crc; } @@ -108,20 +111,20 @@ static int modbus_serial_rtu_send(void *priv, uint8_t slave_addr = modbus->slave_addr; uint16_t crc; - result = serial_write_nonblocking(serial, &slave_addr, sizeof(slave_addr)); + result = serial_write_blocking(serial, &slave_addr, sizeof(slave_addr), 0); if (result < 0) - return result; + return SR_ERR; - result = serial_write_nonblocking(serial, buffer, buffer_size); + result = serial_write_blocking(serial, buffer, buffer_size, 0); if (result < 0) - return result; + return SR_ERR; crc = modbus_serial_rtu_crc(0xFFFF, &slave_addr, sizeof(slave_addr)); crc = modbus_serial_rtu_crc(crc, buffer, buffer_size); - result = serial_write_nonblocking(serial, &crc, sizeof(crc)); + result = serial_write_blocking(serial, &crc, sizeof(crc), 0); if (result < 0) - return result; + return SR_ERR; return SR_OK; } @@ -132,13 +135,13 @@ static int modbus_serial_rtu_read_begin(void *priv, uint8_t *function_code) uint8_t slave_addr; int ret; - ret = serial_read_blocking(modbus->serial, &slave_addr, 1, 100); + ret = serial_read_blocking(modbus->serial, &slave_addr, 1, 500); if (ret != 1 || slave_addr != modbus->slave_addr) - return ret; + return SR_ERR; ret = serial_read_blocking(modbus->serial, function_code, 1, 100); if (ret != 1) - return ret; + return SR_ERR; modbus->crc = modbus_serial_rtu_crc(0xFFFF, &slave_addr, sizeof(slave_addr)); modbus->crc = modbus_serial_rtu_crc(modbus->crc, function_code, 1); @@ -151,11 +154,11 @@ static int modbus_serial_rtu_read_data(void *priv, uint8_t *buf, int maxlen) struct modbus_serial_rtu *modbus = priv; int ret; - ret = serial_read_nonblocking(modbus->serial, buf, maxlen); + ret = serial_read_nonblocking(modbus->serial, buf, maxlen); if (ret < 0) return ret; - modbus->crc = modbus_serial_rtu_crc(modbus->crc, buf, ret); - return ret; + modbus->crc = modbus_serial_rtu_crc(modbus->crc, buf, ret); + return ret; } static int modbus_serial_rtu_read_end(void *priv) @@ -166,7 +169,7 @@ static int modbus_serial_rtu_read_end(void *priv) ret = serial_read_blocking(modbus->serial, &crc, sizeof(crc), 100); if (ret != 2) - return ret; + return SR_ERR; if (crc != modbus->crc) { sr_err("CRC error (0x%04X vs 0x%04X).", crc, modbus->crc); @@ -206,3 +209,5 @@ SR_PRIV const struct sr_modbus_dev_inst modbus_serial_rtu_dev = { .close = modbus_serial_rtu_close, .free = modbus_serial_rtu_free, }; + +#endif