Add experimental RS-485 support

Many modern RS-485 serial devices such as the ones from FTDI already
operate in RS-485 mode by default and will work with tio out of the box.
However, there are some RS-232/485 devices which need to be switched
from e.g. RS-232 to RS-485 mode to operate accordingly on the physical
level.

This commit implements the switching mechanism and interface required to
enable RS-485 mode. It only works on Linux and with serial devices which
use device drivers that support the Linux RS-485 control interface.

The RS-485 feature is detailed via the following options:

 --rs-485                           Enable RS-485 mode
 --rs-485-config <config>           Set RS-485 configuration

Set the RS-485 configuration using the following key or key value pair
format in the configuration field:

 RTS_ON_SEND=value             Set logical level (0 or 1) for RTS pin when sending
 RTS_AFTER_SEND=value          Set logical level (0 or 1) for RTS pin after sending
 RTS_DELAY_BEFORE_SEND=value   Set RTS delay (ms) before sending
 RTS_DELAY_AFTER_SEND=value    Set RTS delay (ms) after sending
 RX_DURING_TX                  Receive data even while sending data

If defining more than one key or key value pair, they must be comma
separated.

Example use:

 $ tio /dev/ttyUSB0 --rs-485 --rs-r485-config=RTS_DELAY_AFTER_SEND=50,RX_DURING_TX
This commit is contained in:
Martin Lund 2022-09-10 15:20:42 +02:00
parent a58d406a3c
commit ee46686fb6
13 changed files with 351 additions and 11 deletions

View file

@ -50,6 +50,7 @@
#include "error.h"
#include "socket.h"
#include "setspeed.h"
#include "rs485.h"
#ifdef __APPLE__
#define PATH_SERIAL_DEVICES "/dev/"
@ -456,6 +457,10 @@ void handle_command_sequence(char input_char, char previous_char, char *output_c
tio_printf("Configuration:");
config_file_print();
options_print();
if (option.rs485)
{
rs485_print_config();
}
break;
case KEY_E:
@ -947,6 +952,12 @@ void tty_restore(void)
{
tcsetattr(fd, TCSANOW, &tio_old);
if (option.rs485)
{
/* Restore original RS-485 mode */
rs485_mode_restore(fd);
}
if (connected)
{
tty_disconnect();
@ -1081,6 +1092,12 @@ int tty_connect(void)
}
#endif
/* Manage RS-485 mode */
if (option.rs485)
{
rs485_mode_enable(fd);
}
/* Make sure we restore tty settings on exit */
if (first)
{