Я использую C, чтобы открыть последовательное устройство и отправлять / получать данные на него или с него. Прием работает без проблем, но любые отправляемые данные не доходят до устройства. Я открываю устройство так:
int open_tty() {
int fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_CLOEXEC);
struct termios config;
cfsetispeed(&config, B38400);
cfsetospeed(&config, B38400);
config.c_cflag &= ~PARENB;
config.c_cflag &= ~CSTOPB;
config.c_cflag &= ~CSIZE;
config.c_cflag |= CS8;
tcsetattr(fd, TCSANOW, &config);
return fd;
}
...
write(fd, data, length)
...
По словам strace, все работает просто отлично:
openat(AT_FDCWD, "/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_CLOEXEC) = 3
ioctl(3, TCGETS, {B38400 -opost isig icanon echo ...}) = 0
ioctl(3, SNDCTL_TMR_START or TCSETS, {B38400 -opost isig icanon echo ...}) = 0
ioctl(3, TCGETS, {B38400 -opost isig icanon echo ...}) = 0
write(3, "some data.......", 16) = 16
Однако устройство не получает никаких данных (оно должно отправить пакет ACK). Если я делаю то же самое в Python, все работает нормально:
s=serial.Serial('/dev/ttyUSB0', baudrate=9600*4)
s.write('some data.......')
Трассирование:
openat(AT_FDCWD, "/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_NONBLOCK|O_CLOEXEC) = 3
ioctl(3, TCGETS, {B38400 -opost isig icanon echo ...}) = 0
ioctl(3, TCGETS, {B38400 -opost isig icanon echo ...}) = 0
ioctl(3, TCGETS, {B38400 -opost isig icanon echo ...}) = 0
ioctl(3, SNDCTL_TMR_START or TCSETS, {B38400 -opost -isig -icanon -echo ...}) = 0
ioctl(3, TCGETS, {B38400 -opost -isig -icanon -echo ...}) = 0
ioctl(3, TIOCMBIS, [TIOCM_DTR]) = 0
ioctl(3, TIOCMBIS, [TIOCM_RTS]) = 0
ioctl(3, TCFLSH, TCIFLUSH) = 0
write(3, "some data.......", 16) = 16
Любая помощь будет принята с благодарностью.
EDIT:
Как предложил @abarnert, я установил биты DTR и RTS и очистил буфер:
char rts = TIOCM_RTS;
char dtr = TIOCM_DTR;
ioctl(fd, TIOCMBIS, &dtr);
ioctl(fd, TIOCMBIS, &rts);
tcflush(fd, TCIFLUSH);
Это привело к тому, что следующие дополнительные системные вызовы отправлялись непосредственно перед вызовом write
:
ioctl(3, TIOCMBIS, [TIOCM_DTR|TIOCM_DSR|0x200]) = 0
ioctl(3, TIOCMBIS, [[TIOCM_RTS|0x30200}) = 0
ioctl(3, TCFLSH, TCIFLUSH) = 0
Тем не менее, я все еще не получаю ACK-пакет от устройства.
Устройство представляет собой VirtualRobotix GPS uBlox 8 (http://www.virtualrobotix.it/index.php/en/shop/gps/3dr-gps-ublox-8-542015-11-30-13-35-34_-detail), подключенный с использованием преобразователя USB в последовательный интерфейс.