LINUX.ORG.RU

История изменений

Исправление 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