LINUX.ORG.RU

Com-port скорость

 ,


0

2

Здравствуйте! Настроил работу через USB адаптер с внешним устройством. При замыкании петли (соединении Rx Tx) ошибок нет. Параметры в системе:

serg@serg-desktop:~$ stty -F /dev/ttyUSB0 speed 115200 baud; line = 0; min = 0; time = 1; -brkint -imaxbel -opost -isig -icanon -echo

Связь с внешним устройством есть, но с ошибками. При внимательном рассмотрении по осциллографу визно, что скорость порта много выше (что то около 2000000) Где порыта собака? Подбирать константу В115200 самому?

Ответ на: комментарий от alx777

Это устройство подключается к другим компам и успешно работает не один год. Задача - организовать управление устройством компьютером на базе linux. И на осциллографе можно посмотреть и проверить временные периоды.

sergvnovg
() автор топика
Ответ на: комментарий от alegz

setserial не использовал. Пишу на Си. процедура инициализации: ''' tcgetattr(fd,&oldtio); // save current port settings tcgetattr(fd,&newtio); // save current port settings

newtio.c_lflag &= ~(ICANON|ECHO|ISIG); newtio.c_cflag |= CS8 | CLOCAL | CREAD | CSTOPB; newtio.c_cflag &= ~(CRTSCTS | PARENB | CSIZE);

cfsetispeed(&newtio,B115200); /* Set Read Speed as 115200 cfsetospeed(&newtio,B115200); /* Set Write Speed as 115200
newtio.c_oflag &= ~OPOST; newtio.c_cc[VTIME] = 1;
newtio.c_cc[VMIN] = 0;
tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW,&newtio); '''

sergvnovg
() автор топика
Ответ на: комментарий от sergvnovg

Попробуй тогда чего попроще, например Python скрипт

import serial

sp = serial.Serial('/dev/ttyUSB0', 115200, timeout=1, bytesize=8, parity='N', stopbits=1)

print(f'{sp.name} opened')

sp.write(bytes('\n', 'utf-8'))

while True:
    l = sp.readline()
    if len(l) > 0:
        print("Read :", l)
    else:
        break
        
sp.close()
print(f'{sp.name} closed')

У меня к /dev/ttyUSB0 подключена serial console:

/dev/ttyUSB0 opened
Read : b'\r\r\n'
Read : b'unit3 login: '
/dev/ttyUSB0 closed
alx777 ★★
()
Последнее исправление: alx777 (всего исправлений: 1)
Ответ на: комментарий от alx777

Проблема решена, разбор: Часть инициализация порта

    newtio.c_cflag |=  CS8 | CLOCAL | CREAD | CSTOPB;
    newtio.c_cflag &= ~(CRTSCTS | PARENB | CSIZE);
    newtio.c_oflag &= ~OPOST;

Сравнивая спиcки флагов двух видов инициализации выявило следующее

Правильно размер слова CS8 а порт настраивался на размер CS5.
То есть скрость правильная , короткие посылки :-(

Хотя при инициализации я даю команду
newtio.c_cflag |=  CS8 | CLOCAL | CREAD | CSTOPB;

а вот дальше
    newtio.c_cflag &= ~(CRTSCTS | PARENB | CSIZE);


где CSIZE = 48 Очищает 2 бита что и соответствует установке размера CS5

Взял готовый шаблон из интернета и попал.

Спасибо за поддержку!
sergvnovg
() автор топика

Я запускал wireshark на компьютере с работающей программой и смотрел на USB-пакеты, там было видно, какая скорость порта устанавливается и прочие параметры.

vbr ★★★
()
Ответ на: комментарий от sergvnovg

Иногда в таких случаях сильно помогает strace

strace -e ioctl python pyserial.py 

ioctl(3, TCGETS, {c_iflag=, c_oflag=NL0|CR0|TAB0|BS0|VT0|FF0|, c_cflag=B115200|CS8|CREAD|CLOCAL, c_lflag=, ...}) = 0
ioctl(3, TCGETS, {c_iflag=, c_oflag=NL0|CR0|TAB0|BS0|VT0|FF0|, c_cflag=B115200|CS8|CREAD|CLOCAL, c_lflag=, ...}) = 0
ioctl(3, TCGETS, {c_iflag=, c_oflag=NL0|CR0|TAB0|BS0|VT0|FF0|, c_cflag=B115200|CS8|CREAD|CLOCAL, c_lflag=, ...}) = 0
ioctl(3, SNDCTL_TMR_START or TCSETS, {c_iflag=, c_oflag=NL0|CR0|TAB0|BS0|VT0|FF0|, c_cflag=B115200|CS8|CREAD|CLOCAL, c_lflag=, ...}) = 0
ioctl(3, TCGETS, {c_iflag=, c_oflag=NL0|CR0|TAB0|BS0|VT0|FF0|, c_cflag=B115200|CS8|CREAD|CLOCAL, c_lflag=, ...}) = 0
strace -v -e ioctl python pyserial.py

ioctl(3, TCGETS, {c_iflag=, c_oflag=NL0|CR0|TAB0|BS0|VT0|FF0|, c_cflag=B115200|CS8|CREAD|CLOCAL, c_lflag=, c_line=N_TTY, c_cc=[[VINTR]=0x3, [VQUIT]=0x1c, [VERASE]=0x7f, [VKILL]=0x15, [VEOF]=0x4, [VTIME]=0, [VMIN]=0, [VSWTC]=0, [VSTART]=0x11, [VSTOP]=0x13, [VSUSP]=0x1a, [VEOL]=0, [VREPRINT]=0x12, [VDISCARD]=0xf, [VWERASE]=0x17, [VLNEXT]=0x16, [VEOL2]=0, [17]=0, [18]=0]}) = 0
ioctl(3, TCGETS, {c_iflag=, c_oflag=NL0|CR0|TAB0|BS0|VT0|FF0|, c_cflag=B115200|CS8|CREAD|CLOCAL, c_lflag=, c_line=N_TTY, c_cc=[[VINTR]=0x3, [VQUIT]=0x1c, [VERASE]=0x7f, [VKILL]=0x15, [VEOF]=0x4, [VTIME]=0, [VMIN]=0, [VSWTC]=0, [VSTART]=0x11, [VSTOP]=0x13, [VSUSP]=0x1a, [VEOL]=0, [VREPRINT]=0x12, [VDISCARD]=0xf, [VWERASE]=0x17, [VLNEXT]=0x16, [VEOL2]=0, [17]=0, [18]=0]}) = 0
ioctl(3, TCGETS, {c_iflag=, c_oflag=NL0|CR0|TAB0|BS0|VT0|FF0|, c_cflag=B115200|CS8|CREAD|CLOCAL, c_lflag=, c_line=N_TTY, c_cc=[[VINTR]=0x3, [VQUIT]=0x1c, [VERASE]=0x7f, [VKILL]=0x15, [VEOF]=0x4, [VTIME]=0, [VMIN]=0, [VSWTC]=0, [VSTART]=0x11, [VSTOP]=0x13, [VSUSP]=0x1a, [VEOL]=0, [VREPRINT]=0x12, [VDISCARD]=0xf, [VWERASE]=0x17, [VLNEXT]=0x16, [VEOL2]=0, [17]=0, [18]=0]}) = 0
ioctl(3, SNDCTL_TMR_START or TCSETS, {c_iflag=, c_oflag=NL0|CR0|TAB0|BS0|VT0|FF0|, c_cflag=B115200|CS8|CREAD|CLOCAL, c_lflag=, c_line=N_TTY, c_cc=[[VINTR]=0x3, [VQUIT]=0x1c, [VERASE]=0x7f, [VKILL]=0x15, [VEOF]=0x4, [VTIME]=0, [VMIN]=0, [VSWTC]=0, [VSTART]=0x11, [VSTOP]=0x13, [VSUSP]=0x1a, [VEOL]=0, [VREPRINT]=0x12, [VDISCARD]=0xf, [VWERASE]=0x17, [VLNEXT]=0x16, [VEOL2]=0, [17]=0, [18]=0]}) = 0
ioctl(3, TCGETS, {c_iflag=, c_oflag=NL0|CR0|TAB0|BS0|VT0|FF0|, c_cflag=B115200|CS8|CREAD|CLOCAL, c_lflag=, c_line=N_TTY, c_cc=[[VINTR]=0x3, [VQUIT]=0x1c, [VERASE]=0x7f, [VKILL]=0x15, [VEOF]=0x4, [VTIME]=0, [VMIN]=0, [VSWTC]=0, [VSTART]=0x11, [VSTOP]=0x13, [VSUSP]=0x1a, [VEOL]=0, [VREPRINT]=0x12, [VDISCARD]=0xf, [VWERASE]=0x17, [VLNEXT]=0x16, [VEOL2]=0, [17]=0, [18]=0]}) = 0
alx777 ★★
()
Последнее исправление: alx777 (всего исправлений: 1)