Commit 807c20f08d9da2eaa42c9effd77d4a6838783002
1 parent
2b985f81
Parity setting is now a single char ('N', 'E' or 'O')
Showing
5 changed files
with
28 additions
and
21 deletions
NEWS
| ... | ... | @@ -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 | ... | ... |