История изменений
Исправление Zubok, (текущая версия) :
interceptty -s 'ispeed 9600 ospeed 9600' /dev/ttyUSB0 /tmp/ttyS0
Вот эти параметры, которые после -s, он передает в stty напрямую. А вот fd /tmp/ttyS0 он создает с группой параметров raw
man stty:
raw same as -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr
-igncr -icrnl -ixon -ixoff -icanon -opost -isig -iuclc -ixany
-imaxbel -xcase min 1 time 0
Смотри. У intercetty терминология такая: backend - это /dev/ttyUSB0, а frontend - это ttyS0. Не путаю? При инициализации backend interceptty пытается поставить его в raw. Показываю:
int setup_back_tty(char *backend, int f[2])
{
int serialfd;
/* Open the serial port */
serialfd = open(backend, O_RDWR | O_NOCTTY | O_SYNC | O_NOCTTY);
if (serialfd < 0)
errorf("error opening backend device '%s': %s\n",backend,strerror(errno));
if (stty_raw(serialfd) != 0)
errorf("Error putting serial device '%s' in raw mode: %s\n",backend,strerror(errno));
[...]
/* Process settings from the -s switch */
if (settings) {
fstty(serialfd,settings);
}
[...]
}
А это stty_raw:
int stty_raw (int fd)
{
[...]
tty_state.c_lflag &= ~(ICANON | IEXTEN | ISIG | ECHO);
tty_state.c_iflag &= ~(ICRNL | INPCK | ISTRIP | IXON | BRKINT);
tty_state.c_oflag &= ~OPOST;
tty_state.c_cflag |= CS8;
[...]
}
Что мы видим по коду? сначала interceptty переводит устройство в режим raw, а потом передает в него параметры, которые ты указал после '-s'. Полагаю, что PySerial этого не делает, но надо покопаться и посмотреть, как это сделать. Возможно, там есть более низкоуровневый класс, чтобы сделать это. В этом, наверное, и отличие инициализации interceptty и PySerial.
Можешь попробовать сделать перед PyModbus. Заработает?
$ stty -F /dev/USB0 raw cs8 -crtscts -echo
Исправление Zubok, :
interceptty -s 'ispeed 9600 ospeed 9600' /dev/ttyUSB0 /tmp/ttyS0
Вот эти параметры, которые после -s, он передает в stty напрямую. А вот fd /tmp/ttyS0 он создает с группой параметров raw
man stty:
raw same as -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr
-igncr -icrnl -ixon -ixoff -icanon -opost -isig -iuclc -ixany
-imaxbel -xcase min 1 time 0
Смотри. У intercetty терминология такая: backend - это /dev/ttyUSB0, а frontend - это ttyS0. Не путаю? При инициализации backend interceptty пытается поставить его в raw. Показываю:
int setup_back_tty(char *backend, int f[2])
{
int serialfd;
/* Open the serial port */
serialfd = open(backend, O_RDWR | O_NOCTTY | O_SYNC | O_NOCTTY);
if (serialfd < 0)
errorf("error opening backend device '%s': %s\n",backend,strerror(errno));
if (stty_raw(serialfd) != 0)
errorf("Error putting serial device '%s' in raw mode: %s\n",backend,strerror(errno));
[...]
/* Process settings from the -s switch */
if (settings) {
fstty(serialfd,settings);
}
[...]
}
А это stty_raw:
int stty_raw (int fd)
{
[...]
tty_state.c_lflag &= ~(ICANON | IEXTEN | ISIG | ECHO);
tty_state.c_iflag &= ~(ICRNL | INPCK | ISTRIP | IXON | BRKINT);
tty_state.c_oflag &= ~OPOST;
tty_state.c_cflag |= CS8;
[...]
}
Что мы видим по коду? сначала interceptty переводит устройство в режим raw, а потом передает в него параметры, которые ты указал после '-s'. Полагаю, что PySerial этого не делает, но надо покопаться и посмотреть, как это сделать. Возможно, там есть более низкоуровневый класс, чтобы сделать это. В этом, наверное, и отличие инициализации interceptty и PySerial.
Можешь попробовать сделать перед PyModbus. Заработает?
$ stty -F /dev/USB0 raw cs8 -crtscts
Исходная версия Zubok, :
interceptty -s 'ispeed 9600 ospeed 9600' /dev/ttyUSB0 /tmp/ttyS0
Вот эти параметры, которые после -s, он передает в stty напрямую. А вот fd /tmp/ttyS0 он создает с группой параметров raw
man stty:
raw same as -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr
-igncr -icrnl -ixon -ixoff -icanon -opost -isig -iuclc -ixany
-imaxbel -xcase min 1 time 0
Смотри. У intercetty терминология такая: backend - это /dev/ttyUSB0, а frontend - это ttyS0. Не путаю? При инициализации backend interceptty пытается поставить его в raw. Показываю:
int setup_back_tty(char *backend, int f[2])
{
int serialfd;
/* Open the serial port */
serialfd = open(backend, O_RDWR | O_NOCTTY | O_SYNC | O_NOCTTY);
if (serialfd < 0)
errorf("error opening backend device '%s': %s\n",backend,strerror(errno));
if (stty_raw(serialfd) != 0)
errorf("Error putting serial device '%s' in raw mode: %s\n",backend,strerror(errno));
[...]
/* Process settings from the -s switch */
if (settings) {
fstty(serialfd,settings);
}
[...]
}
А это stty_raw:
int stty_raw (int fd)
{
[...]
tty_state.c_lflag &= ~(ICANON | IEXTEN | ISIG | ECHO);
tty_state.c_iflag &= ~(ICRNL | INPCK | ISTRIP | IXON | BRKINT);
tty_state.c_oflag &= ~OPOST;
tty_state.c_cflag |= CS8;
[...]
}
Что мы видим по коду? сначала interceptty переводит устройство в режим raw, а потом передает в него параметры, которые ты указал после '-s'. Полагаю, что PySerial этого не делает, но надо покопаться и посмотреть, как это сделать. Возможно, там есть более низкоуровневый класс, чтобы сделать это. В этом, наверное, и отличие инициализации interceptty и PySerial.
Можешь попробовать сделать перед PyModbus. Заработает?
$ stty -F /dev/USB0 raw cs8