Прежде всего, не знаю, почему вы сначала устанавливаете все поля termios в 0, а затем, без каких-либо изменений в предшествующий ему 0, решаете установить обычные флаги rs232 для cflag. (вместо того, чтобы делать это без ИЛИ напрямую, где вы теперь установите его на 0 выше).
Что бы вы хотели установить вместо всех этих флагов - просто cfmakeraw () поля termios.
также sync (); без каких-либо параметров (НЕ fsync!;), похоже, отправляет весь ожидающий вывод на ВСЕ файловые дескрипторы, а не только на блочные устройства. также сокеты tcp и rs232 ..
, а также open () имеет опцию O_SYNC (O_SYNC и O_ASYNC имеют сбивающие с толку имена, но не имеют ничего общего с тактируемым протоколом последовательной линии или нет, тот немедленно фиксирует write (), а другой генерирует сигнал для перехват, когда ввод становится доступным (вроде как rs232 на основе IRQ на DOS;)
установка O_SYNC в open () может уже решить вашу проблему.
также «читая данные на другом конце» ... есть такие вещи, как «светодиоды» и «резисторы», которые вы можете просто подключить к TXD и увидеть данные;) также есть вещи, которые называются «rs232 breakout» box 'или область видимости, которая может сделать его - непосредственно видимым -;) гораздо проще, чем "угадывать", какая сторона ведет себя неправильно.
ВНИМАНИЕ: НЕ ИСПЫТАЛ КОД. это компилируется. но у меня все мои кабели ttyUSB0 в другом здании. но я думаю, что ваша главная проблема в любом случае O_SYNC. установка для всех termios crap значения 0 почти такая же, как для cfmakeraw () ... и зачем устанавливать CREAD, если вы собираетесь открывать его только для записи? (зачем открывать его только для записи, а не для чтения в любом случае? - а также только с записью, вам не нужно бояться, что он станет управляющим tty (O_NOCTTY;), так что в случае только записи это тоже точно не нужно .. .
только что заметил, что форматер% i (то же самое для% d btw) также вызывает несоответствие типов, предупреждающее возвращаемое значение ssize_t для write (), приведенное к (int)
#include<termios.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
void main(){
int fd;
struct termios tty;
fd=-1;
while(fd<0){fd=open("/dev/ttyUSB0",O_WRONLY|O_NONBLOCK|O_NOCTTY|O_SYNC);sleep(1);};
cfmakeraw(&tty);
tty.c_cflag=CREAD|CRTSCTS|HUPCL|CS8;
cfsetospeed(&tty,B19200);
cfsetispeed(&tty,B19200);
tcsetattr(fd,TCSANOW,&tty);
printf("Write: %i\n",(int)write(fd,"HELLO",5));
sync();//if all else fails, also try without, O_SYNC should already fix that.
close(fd);
};