我了解串行端口的规范模式,读取将仅返回,直到输入队列遇到换行符为止。
我将两个PL2303 USB连接到串行设备(TX-> RX,RX-> TX)
写了两个C代码,一个用于从/ dev / ttyUSB0接收,另一个用于从/ dev / ttyUSB1写入
canonical_write.c:
#include <stdio.h>
#include <sys/types.h>
#include <termios.h>
#include <fcntl.h>
#include <stdlib.h>
#define SERIAL_DEVICE "/dev/ttyUSB1"
int main()
{
struct termios serial_port_settings;
int fd;
int retval;
char buf[256] = "hello world \n test \n";
char ch;
int i;
fd = open(SERIAL_DEVICE, O_RDWR);
if (fd < 0) {
perror("Failed to open SERIAL_DEVICE");
exit(1);
}
retval = tcgetattr(fd, &serial_port_settings);
if (retval < 0) {
perror("Failed to get termios structure");
exit(2);
}
//setting baud rate to B38400
retval = cfsetospeed(&serial_port_settings, B38400);
if (retval < 0) {
perror("Failed to set 9600 output baud rate");
exit(3);
}
retval = cfsetispeed(&serial_port_settings, B38400);
if (retval < 0) {
perror("Failed to set 9600 input baud rate");
exit(4);
}
serial_port_settings.c_lflag |= ICANON;
retval = tcsetattr(fd, TCSANOW, &serial_port_settings);
if (retval < 0) {
perror("Failed to set serial attributes");
exit(5);
}
printf("Successfully set the baud rate\n");
for (i = 0; buf[i] != '\0'; i++) {
ch = buf[i];
printf("Writing character :%c ASCII:%d\n", ch, ch);
retval = write(fd, &ch, sizeof(ch));
if (retval < 0) {
perror("write on SERIAL_DEVICE failed");
exit(6);
}
sleep(1);
}
close(fd);
return 0;
}
canonical_read.c
#include <stdio.h>
#include <sys/types.h>
#include <termios.h>
#include <fcntl.h>
#include <stdlib.h>
#define SERIAL_DEVICE "/dev/ttyUSB0"
int main()
{
struct termios serial_port_settings;
int fd;
int retval;
char buf[256];
int i, loop = 2;
fd = open(SERIAL_DEVICE, O_RDWR);
if (fd < 0) {
perror("Failed to open SERIAL_DEVICE");
exit(1);
}
retval = tcgetattr(fd, &serial_port_settings);
if (retval < 0) {
perror("Failed to get termios structure");
exit(2);
}
//setting baud rate to B38400
retval = cfsetospeed(&serial_port_settings, B38400);
if (retval < 0) {
perror("Failed to set 9600 output baud rate");
exit(3);
}
retval = cfsetispeed(&serial_port_settings, B38400);
if (retval < 0) {
perror("Failed to set 9600 input baud rate");
exit(4);
}
serial_port_settings.c_lflag |= ICANON;
//Disable ECHO
serial_port_settings.c_lflag &= ~(ECHO | ECHOE);
retval = tcsetattr(fd, TCSANOW, &serial_port_settings);
if (retval < 0) {
perror("Failed to set serial attributes");
exit(5);
}
printf("Successfully set the baud rate\n");
while (loop--) {
retval = read(fd, buf, sizeof(buf));
if (retval < 0) {
perror("Read on SERIAL_DEVICE failed");
exit(6);
}
printf("Read returned %d bytes\n", retval);
for (i = 0; i < retval; i++) {
printf("Read Character:%c \t ASCII:%d\n", buf[i], buf[i]);
}
}
close(fd);
return 0;
}
同时运行两个程序时,第一次读取成功返回“ hello world”,但是第二次读取返回“ \ n” ASCII 10。
预期的行为是返回“测试”权限。在canonical_read.c中配置ttyUSB0时是否错过了任何设置
当我将缓冲区替换为
char buf[256] = "hello world \r test \n";
我得到正确的输出。
感谢您的帮助和时间