Commit ef7ae05367932ed923058decac0de71a3e1b4456

Authored by Stéphane Raimbault
1 parent cb692215

Fix setting baud rate for Linux (partial revert of fa20798)

Showing 1 changed file with 129 additions and 4 deletions
src/modbus-rtu.c
... ... @@ -12,9 +12,8 @@
12 12 #ifndef _MSC_VER
13 13 #include <unistd.h>
14 14 #endif
15   -#include <assert.h>
16   -
17 15 #include "modbus-private.h"
  16 +#include <assert.h>
18 17  
19 18 #include "modbus-rtu-private.h"
20 19 #include "modbus-rtu.h"
... ... @@ -505,11 +504,125 @@ static int _modbus_rtu_connect(modbus_t *ctx)
505 504 return 0;
506 505 }
507 506 #else
  507 +
  508 +static speed_t _get_termios_speed(int baud, int debug)
  509 +{
  510 + speed_t speed;
  511 +
  512 + switch (baud) {
  513 + case 110:
  514 + speed = B110;
  515 + break;
  516 + case 300:
  517 + speed = B300;
  518 + break;
  519 + case 600:
  520 + speed = B600;
  521 + break;
  522 + case 1200:
  523 + speed = B1200;
  524 + break;
  525 + case 2400:
  526 + speed = B2400;
  527 + break;
  528 + case 4800:
  529 + speed = B4800;
  530 + break;
  531 + case 9600:
  532 + speed = B9600;
  533 + break;
  534 + case 19200:
  535 + speed = B19200;
  536 + break;
  537 + case 38400:
  538 + speed = B38400;
  539 + break;
  540 +#ifdef B57600
  541 + case 57600:
  542 + speed = B57600;
  543 + break;
  544 +#endif
  545 +#ifdef B115200
  546 + case 115200:
  547 + speed = B115200;
  548 + break;
  549 +#endif
  550 +#ifdef B230400
  551 + case 230400:
  552 + speed = B230400;
  553 + break;
  554 +#endif
  555 +#ifdef B460800
  556 + case 460800:
  557 + speed = B460800;
  558 + break;
  559 +#endif
  560 +#ifdef B500000
  561 + case 500000:
  562 + speed = B500000;
  563 + break;
  564 +#endif
  565 +#ifdef B576000
  566 + case 576000:
  567 + speed = B576000;
  568 + break;
  569 +#endif
  570 +#ifdef B921600
  571 + case 921600:
  572 + speed = B921600;
  573 + break;
  574 +#endif
  575 +#ifdef B1000000
  576 + case 1000000:
  577 + speed = B1000000;
  578 + break;
  579 +#endif
  580 +#ifdef B1152000
  581 + case 1152000:
  582 + speed = B1152000;
  583 + break;
  584 +#endif
  585 +#ifdef B1500000
  586 + case 1500000:
  587 + speed = B1500000;
  588 + break;
  589 +#endif
  590 +#ifdef B2500000
  591 + case 2500000:
  592 + speed = B2500000;
  593 + break;
  594 +#endif
  595 +#ifdef B3000000
  596 + case 3000000:
  597 + speed = B3000000;
  598 + break;
  599 +#endif
  600 +#ifdef B3500000
  601 + case 3500000:
  602 + speed = B3500000;
  603 + break;
  604 +#endif
  605 +#ifdef B4000000
  606 + case 4000000:
  607 + speed = B4000000;
  608 + break;
  609 +#endif
  610 + default:
  611 + speed = B9600;
  612 + if (debug) {
  613 + fprintf(stderr, "WARNING Unknown baud rate %d (B9600 used)\n", baud);
  614 + }
  615 + }
  616 +
  617 + return speed;
  618 +}
  619 +
508 620 /* POSIX */
509 621 static int _modbus_rtu_connect(modbus_t *ctx)
510 622 {
511 623 struct termios tios;
512 624 int flags;
  625 + speed_t speed;
513 626 modbus_rtu_t *ctx_rtu = ctx->backend_data;
514 627  
515 628 if (ctx->debug) {
... ... @@ -554,8 +667,20 @@ static int _modbus_rtu_connect(modbus_t *ctx)
554 667 */
555 668  
556 669 /* Set the baud rate */
557   - if ((cfsetispeed(&tios, ctx_rtu->baud) < 0) ||
558   - (cfsetospeed(&tios, ctx_rtu->baud) < 0)) {
  670 +
  671 + /*
  672 + On MacOS, constants of baud rates are equal to the integer in argument but
  673 + that's not the case under Linux so we have to find the corresponding
  674 + constant. Until the code is upgraded to termios2, the list of possible
  675 + values is limited (no 14400 for example).
  676 + */
  677 + if (9600 == B9600) {
  678 + speed = ctx_rtu->baud;
  679 + } else {
  680 + speed = _get_termios_speed(ctx_rtu->baud, ctx->debug);
  681 + }
  682 +
  683 + if ((cfsetispeed(&tios, speed) < 0) || (cfsetospeed(&tios, speed) < 0)) {
559 684 close(ctx->s);
560 685 ctx->s = -1;
561 686 return -1;
... ...