X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;ds=inline;f=src%2Fmodbus%2Fmodbus_serial_rtu.c;h=8123ee9afdeed3abeefb8cc96874a7e2a0d5a6e2;hb=ffd150decfdde9c1bcfc291f633ac6aa91f140b3;hp=b723020ba257064d492dd0d111d5b27102645656;hpb=c1aae90038456a61d0f9313d34e6107c3440d3e7;p=libsigrok.git
diff --git a/src/modbus/modbus_serial_rtu.c b/src/modbus/modbus_serial_rtu.c
index b723020b..8123ee9a 100644
--- a/src/modbus/modbus_serial_rtu.c
+++ b/src/modbus/modbus_serial_rtu.c
@@ -17,6 +17,7 @@
* along with this program. If not, see .
*/
+#include
#include
#include
#include
@@ -25,6 +26,8 @@
#define LOG_PREFIX "modbus_serial"
+#ifdef HAVE_SERIAL_COMM
+
#define BUFFER_SIZE 1024
struct modbus_serial_rtu {
@@ -54,9 +57,6 @@ static int modbus_serial_rtu_open(void *priv)
if (serial_open(serial, SERIAL_RDWR) != SR_OK)
return SR_ERR;
- if (serial_flush(serial) != SR_OK)
- return SR_ERR;
-
return SR_OK;
}
@@ -78,27 +78,6 @@ static int modbus_serial_rtu_source_remove(struct sr_session *session,
return serial_source_remove(session, serial);
}
-static uint16_t modbus_serial_rtu_crc(uint16_t crc,
- const uint8_t *buffer, int len)
-{
- int i;
-
- if (!buffer || len < 0)
- return crc;
-
- while (len--) {
- crc ^= *buffer++;
- for (i = 0; i < 8; i++) {
- int carry = crc & 1;
- crc >>= 1;
- if (carry)
- crc ^= 0xA001;
- }
- }
-
- return crc;
-}
-
static int modbus_serial_rtu_send(void *priv,
const uint8_t *buffer, int buffer_size)
{
@@ -108,20 +87,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);
+ crc = sr_crc16(SR_CRC16_DEFAULT_INIT, &slave_addr, sizeof(slave_addr));
+ crc = sr_crc16(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,16 +111,16 @@ 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);
+ modbus->crc = sr_crc16(SR_CRC16_DEFAULT_INIT, &slave_addr, sizeof(slave_addr));
+ modbus->crc = sr_crc16(modbus->crc, function_code, 1);
return SR_OK;
}
@@ -151,11 +130,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 = sr_crc16(modbus->crc, buf, ret);
+ return ret;
}
static int modbus_serial_rtu_read_end(void *priv)
@@ -166,7 +145,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 +185,5 @@ SR_PRIV const struct sr_modbus_dev_inst modbus_serial_rtu_dev = {
.close = modbus_serial_rtu_close,
.free = modbus_serial_rtu_free,
};
+
+#endif