Я пытаюсь написать простую программу, которая отправляет байты по последовательному соединению. Я создал цикл передачи данных с помощью socat следующим образом:
$ socat -d -d pty pty
Это создает цикл передачи данных между /dev/pts/2 и /dev/pts/0. Когда я пытаюсь использовать termios в своей программе C для записи нескольких байтов, я успешно могу открыть последовательное соединение с помощью open(). Затем я пишу несколько байтов, используя write(), и получаю количество записанных байтов. Тем не менее, когда я слушаю противоположные стороны, я не вижу никакого результата. Я использовал их, чтобы попытаться прослушать в другом терминале:
$ cat /dev/pts/0 | xxd
$ read -r line < /dev/pts/0
$ echo $line
Я знаю, что мое соединение socat работает, потому что, когда я повторяю байты и слушаю их на другом конце, я получаю их нормально.
#define BAUD_RATE B9600
#define PORT_NAME "/dev/pts/2"
/* Serial Connection Manager */
struct termios tty;
int fd;
int main(){
/*
O_RDWR: read/write access to serial port
O_NOCTTY: No terminal will control the process
O_NDELAY: Non-blocking, returns immediately
*/
fd = open(PORT_NAME, O_RDWR | O_NOCTTY | O_NDELAY);
printf("%s\n", PORT_NAME);
if (fd == -1) {
printf("Error in opening serial port\n");
return -1;
}
else
printf("Port opened successfully\n");
tcgetattr(fd, &tty); // get current attrs of serial port
// raw mode of terminal driver
//cfsetispeed(&tty, BAUD_RATE);
//cfsetospeed(&tty, BAUD_RATE);
cfmakeraw(&tty);
// set additional control modes
cfsetspeed(&tty, (speed_t) BAUD_RATE);
tty.c_cflag &= ~CSTOPB; //1 stop bit
tty.c_cflag &= ~CRTSCTS; //disable hardware flow control
tty.c_cflag |= CLOCAL; //ignore modem control lines
tty.c_cflag |= CREAD; //enable receiver
if((tcsetattr(fd, TCSANOW, &tty)) != 0){
printf("Error in setting attributes\n");
close(fd);
return -1;
}
else
printf("BaudRate = %d\nStopBits = 1\nParity = Odd\n", BAUD_RATE);
sleep(1); // wait for configuration
tcflush(fd, TCIOFLUSH);
char buf[3] = "abc";
int bytes_written = write(fd, buf, 3);
printf("Bytes written: %d", bytes_written);
close(fd);
return 0;
}
Я ожидал, что смогу прослушивать байты, используя $ read -r output < /dev/pts/0
, и что при эхо-выводе будет отображаться «abc».
Запуск моей программы дает следующий результат:
/dev/pts/2
Port opened successfully
BaudRate = 13
StopBits = 1
Parity = Odd
Bytes written: 3
Итак, я знаю, что байты куда-то идут, так как write() не возвращает -1.