LINUX C 串口接收数据的时候 0D 变成了0A
时间: 2023-08-16 15:03:35 浏览: 236
C 串口通信 A/D转换
这是因为在串口传输数据的过程中,有时会将回车符(CR,0x0D)和换行符(LF,0x0A)混淆。在 Linux C 中,可以通过设置串口属性来解决这个问题。
具体来说,可以使用 termios 结构体中的 c_oflag 属性来控制输出的标志位,其中包括 ONLCR(将输出的 CR 转换为 CR+LF)。如果需要将回车符转换成换行符,可以将 ONLCR 标志位置为 1;如果需要保留回车符不变,可以将 ONLCR 标志位置为 0。
示例代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
int main(void)
{
int fd, n;
char buf[1024];
struct termios options;
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd < 0) {
perror("open");
exit(EXIT_FAILURE);
}
fcntl(fd, F_SETFL, 0);
tcgetattr(fd, &options);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_oflag |= ONLCR;
options.c_cc[VMIN] = 1;
options.c_cc[VTIME] = 0;
tcsetattr(fd, TCSANOW, &options);
while (1) {
n = read(fd, buf, sizeof(buf));
if (n < 0) {
perror("read");
exit(EXIT_FAILURE);
}
buf[n] = '\0';
printf("%s", buf);
}
close(fd);
return 0;
}
```
在上面的代码中,通过设置 options.c_oflag |= ONLCR; 将输出的 CR 转换成 CR+LF。如果需要保留回车符不变,可以将 ONLCR 标志位改为 0。
阅读全文