Commit 807c20f08d9da2eaa42c9effd77d4a6838783002

Authored by Stéphane Raimbault
1 parent 2b985f81

Parity setting is now a single char ('N', 'E' or 'O')

... ... @@ -12,6 +12,7 @@ libmodbus 2.1.1 (2010-XX-XX)
12 12 Original patch by Sisyph (eric-paul).
13 13 - Fix #591142 - Slave id check should be disabled in TCP connection
14 14 Reported by aladdinwu.
  15 +- Parity setting is now a single char ('N', 'E' or 'O')
15 16  
16 17 libmodbus 2.1.0 (2010-03-24)
17 18 ============================
... ...
src/modbus.c
... ... @@ -1480,27 +1480,31 @@ void init_common(modbus_param_t *mb_param)
1480 1480 /* Initializes the modbus_param_t structure for RTU
1481 1481 - device: "/dev/ttyS0"
1482 1482 - baud: 9600, 19200, 57600, 115200, etc
1483   - - parity: "even", "odd" or "none"
  1483 + - parity: 'N' stands for None, 'E' for Even and 'O' for odd
1484 1484 - data_bits: 5, 6, 7, 8
1485 1485 - stop_bits: 1, 2
1486 1486 - slave: slave number
1487 1487 */
1488 1488 int modbus_init_rtu(modbus_param_t *mb_param, const char *device,
1489   - int baud, const char *parity, int data_bit,
  1489 + int baud, char parity, int data_bit,
1490 1490 int stop_bit, int slave)
1491 1491 {
1492 1492 memset(mb_param, 0, sizeof(modbus_param_t));
  1493 + init_common(mb_param);
  1494 +
1493 1495 strcpy(mb_param->device, device);
1494 1496 mb_param->baud = baud;
1495   - strcpy(mb_param->parity, parity);
  1497 + if (parity == 'N' || parity == 'E' || parity == 'O') {
  1498 + mb_param->parity = parity;
  1499 + } else {
  1500 + errno = EINVAL;
  1501 + return -1;
  1502 + }
1496 1503 mb_param->debug = FALSE;
1497 1504 mb_param->data_bit = data_bit;
1498 1505 mb_param->stop_bit = stop_bit;
1499 1506 mb_param->type_com = RTU;
1500 1507 mb_param->error_recovery = FALSE;
1501   -
1502   - init_common(mb_param);
1503   -
1504 1508 return modbus_set_slave(mb_param, slave);
1505 1509 }
1506 1510  
... ... @@ -1516,6 +1520,8 @@ int modbus_init_rtu(modbus_param_t *mb_param, const char *device,
1516 1520 int modbus_init_tcp(modbus_param_t *mb_param, const char *ip, int port)
1517 1521 {
1518 1522 memset(mb_param, 0, sizeof(modbus_param_t));
  1523 + init_common(mb_param);
  1524 +
1519 1525 strncpy(mb_param->ip, ip, sizeof(char)*16);
1520 1526 mb_param->port = port;
1521 1527 mb_param->type_com = TCP;
... ... @@ -1523,8 +1529,6 @@ int modbus_init_tcp(modbus_param_t *mb_param, const char *ip, int port)
1523 1529 /* Can be changed after to reach remote serial Modbus device */
1524 1530 mb_param->slave = 0xFF;
1525 1531  
1526   - init_common(mb_param);
1527   -
1528 1532 return 0;
1529 1533 }
1530 1534  
... ... @@ -1600,8 +1604,9 @@ static int modbus_connect_rtu(modbus_param_t *mb_param)
1600 1604 speed_t speed;
1601 1605  
1602 1606 if (mb_param->debug) {
1603   - printf("Opening %s at %d bauds (%s)\n",
1604   - mb_param->device, mb_param->baud, mb_param->parity);
  1607 + printf("Opening %s at %d bauds (%c, %d, %d)\n",
  1608 + mb_param->device, mb_param->baud, mb_param->parity,
  1609 + mb_param->data_bit, mb_param->stop_bit);
1605 1610 }
1606 1611  
1607 1612 /* The O_NOCTTY flag tells UNIX that this program doesn't want
... ... @@ -1710,13 +1715,15 @@ static int modbus_connect_rtu(modbus_param_t *mb_param)
1710 1715  
1711 1716 /* PARENB Enable parity bit
1712 1717 PARODD Use odd parity instead of even */
1713   - if (strncmp(mb_param->parity, "none", 4) == 0) {
  1718 + if (mb_param->parity == 'N') {
  1719 + /* None */
1714 1720 tios.c_cflag &=~ PARENB;
1715   - } else if (strncmp(mb_param->parity, "even", 4) == 0) {
  1721 + } else if (mb_param->parity == 'E') {
  1722 + /* Even */
1716 1723 tios.c_cflag |= PARENB;
1717 1724 tios.c_cflag &=~ PARODD;
1718 1725 } else {
1719   - /* odd */
  1726 + /* Odd */
1720 1727 tios.c_cflag |= PARENB;
1721 1728 tios.c_cflag |= PARODD;
1722 1729 }
... ... @@ -1778,7 +1785,8 @@ static int modbus_connect_rtu(modbus_param_t *mb_param)
1778 1785 IUCLC Map uppercase to lowercase
1779 1786 IMAXBEL Echo BEL on input line too long
1780 1787 */
1781   - if (strncmp(mb_param->parity, "none", 4) == 0) {
  1788 + if (mb_param->parity == 'N') {
  1789 + /* None */
1782 1790 tios.c_iflag &= ~INPCK;
1783 1791 } else {
1784 1792 tios.c_iflag |= INPCK;
... ...
src/modbus.h.in
... ... @@ -227,8 +227,8 @@ typedef struct {
227 227 uint8_t data_bit;
228 228 /* Stop bit */
229 229 uint8_t stop_bit;
230   - /* Parity: "even", "odd", "none" */
231   - char parity[5];
  230 + /* Parity: 'N', 'O', 'E' */
  231 + char parity;
232 232 /* In error_treat with TCP, do a reconnect or just dump the error */
233 233 uint8_t error_recovery;
234 234 /* IP address */
... ... @@ -251,7 +251,7 @@ typedef struct {
251 251 } modbus_mapping_t;
252 252  
253 253 int modbus_init_rtu(modbus_param_t *mb_param, const char *device,
254   - int baud, const char *parity, int data_bit,
  254 + int baud, char parity, int data_bit,
255 255 int stop_bit, int slave);
256 256 int modbus_init_tcp(modbus_param_t *mb_param, const char *ip_address, int port);
257 257 int modbus_set_slave(modbus_param_t *mb_param, int slave);
... ...
tests/random-test-master.c
... ... @@ -58,9 +58,8 @@ int main(void)
58 58 uint16_t *tab_rp_registers;
59 59 modbus_param_t mb_param;
60 60  
61   - /* RTU parity : none, even, odd */
62 61 /*
63   - modbus_init_rtu(&mb_param, "/dev/ttyS0", 19200, "none", 8, 1, MY_ID);
  62 + modbus_init_rtu(&mb_param, "/dev/ttyS0", 19200, 'N', 8, 1, MY_ID);
64 63 */
65 64  
66 65 /* TCP */
... ...
tests/unit-test-master.c
... ... @@ -39,9 +39,8 @@ int main(void)
39 39 struct timeval timeout_begin_old;
40 40 struct timeval timeout_begin_new;
41 41  
42   - /* RTU parity : none, even, odd */
43 42 /*
44   - modbus_init_rtu(&mb_param, "/dev/ttyS0", 19200, "none", 8, 1,
  43 + modbus_init_rtu(&mb_param, "/dev/ttyS0", 19200, 'N', 8, 1,
45 44 CLIENT_ID);
46 45 */
47 46  
... ...