C语言 Linux 插入回车换行符,而不仅仅是换行符



我正在嵌入式Linux系统中通过UART接口编写ASCII命令。

我首先用笔记本电脑测试了代码。嵌入式平台和笔记本电脑都共享一个FTDI USB加密狗。两个平台上的代码应该是相同的(我认为(。

我正在创建一个字符串并像这样发送它,

char cmd[MAX_STR_LEN];
sprintf(cmd,"r %02x %02xn",chipAddr,naddr);
ssize_t bytes_tx = write(fd, (char *)cmd, strlen(cmd));
if (bytes_tx < 0){
ERROR_PRINT("%sn",strerror(errno));
return -1;
}

当我在从PC运行代码时监视示波器上串行设备的输出时,我看到n被正确解释为0x0a

当我在嵌入式平台上运行相同的代码片段时,我看到n被解释为0x0d 0x0arn

如何强制嵌入式平台仅发送n0x0a?嵌入式平台运行使用 buildroot 生成的 Linux Kernel 4.4.x。

---更新了完整测试代码

在此处放置完整代码:https://pastebin.com/5dWhaaDv

嵌入式和笔记本电脑目标的结果,

Connected to /dev/ttyUSB0
strlen 8 : r 40 00
tx cmd[0] = 72 r
tx cmd[1] = 20  
tx cmd[2] = 34 4
tx cmd[3] = 30 0
tx cmd[4] = 20  
tx cmd[5] = 30 0
tx cmd[6] = 30 0
tx cmd[7] = 0a 
bytes_tx = 8
sizeof(n) : 4

问题是没有正确设置 termios 结构标志 : c_oflag

来自 termios 文档 ( https://en.wikibooks.org/wiki/Serial_Programming/termios (

//
// Output flags - Turn off output processing
//
// no CR to NL translation, no NL to CR-NL translation,
// no NL to CR translation, no column 0 CR suppression,
// no Ctrl-D suppression, no fill characters, no case mapping,
// no local output processing
//
// config.c_oflag &= ~(OCRNL | ONLCR | ONLRET |
//                     ONOCR | ONOEOT| OFILL | OLCUC | OPOST);
config.c_oflag = 0;

它显然在一个平台上初始化,而不是在另一个平台上初始化。感谢@KamilCuk和@EugeneSh。以查找问题。

最新更新