我正在尝试编写一个简单的程序,该程序通过串行连接发送字节。我使用socat创建了一个数据传输循环,如下所示:
$ socat -d -d pty pty
这将在/ dev / pts / 2和/ dev / pts / 0之间创建一个数据传输循环。当我尝试在C程序中使用termios写入一些字节时,我能够使用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。
答案 0 :(得分:0)
您的代码对我的真实和虚拟串行端口都可以正常工作。
您需要注意socat
输出:
$ socat -d -d pty pty
2019/07/18 07:55:45 socat[8144] N PTY is /dev/pts/2
2019/07/18 07:55:45 socat[8144] N PTY is /dev/pts/3
2019/07/18 07:55:45 socat[8144] N starting data transfer loop with FDs [5,5] and [7,7]
然后在配对的第一个端口上监听:
$ cat /dev/pts/2
然后运行您的代码(与PORT_NAME "/dev/pts/2"
一起编译),您将在运行abc
的终端上看到cat
con。
您还可以尝试使用minicom或您喜欢的任何其他终端连接到/dev/pts/2
或/dev/pts/3
,您将看到输出:
$ minicom -D /dev/pts/2 -b 9600