gpt4 book ai didi

c - 串口通讯中换行字符的意义

转载 作者:太空宇宙 更新时间:2023-11-04 10:05:00 40 4
gpt4 key购买 nike

我们正在测试串口通信。设备上有两个tty节点/dev/ttyUSB8和/dev/ttyUSB9。

当我将缓冲区从/dev/ttyUSB8 传输到/dev/ttyUSB9 时,如果缓冲区不包含新行,我不会在/dev/ttyUSB9 读取调用上接收数据。

传输代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>

void write_func()
{
int fdw;
int i;
fdw = open("/dev/ttyUSB8", O_RDWR);
printf("fdw : %d\n",fdw);

printf("%ld\n", write(fdw, "Hello", 6));
close(fdw);
}

int main()
{
int i;
write_func();
return 0;
}

接收代码

void read_thread()
{

int fdr;
char buf[] = "NoData";

fdr = open("/dev/ttyUSB9", O_RDWR);
printf("fdr : %d\n",fdr);

printf("%s: %ld\n", __func__, read(fdr, buf, 6));

printf("%s\n", buf);
close(fdr);
}

int main()
{
int i;
read_thread();
return 0;
}

我没有通过上述调用接收数据,但是当我在写入调用中添加 '\n 时,我在读取 block 调用中获得了数据。

 printf("%ld\n", write(fdw, "Hello\n", 7));

换行符的意义是什么..

更新:

我添加了重置规范模式的代码,但仍然没有用:

void write_thread()
{

int fdw;
int i;
struct termios config;
fdw = open("/dev/ttymib24", O_RDWR);
printf("fdw : %d\n",fdw);
tcgetattr(fdw, &config);
config.c_lflag &= ~ICANON;
tcsetattr(fdw, TCSANOW, &config);
printf("%ld\n", write(fdw, "Hello", 6));
close(fdw);
}

最佳答案

您的 tty 可能处于规范模式。

尝试使用 tcsetattr() 重置 ICANON。像这样:

struct termios termiosv;
tcgetattr(fd, &termiosv);
termiosv.c_lflag &= ~ICANON;
tcsetattr(fd, TCSANOW, &termiosv);

更多信息参见 termios 的手册页:

   In canonical mode:

* Input is made available line by line. An input line is available
when one of the line delimiters is typed (NL, EOL, EOL2; or EOF at
the start of line). Except in the case of EOF, the line delimiter
is included in the buffer returned by read(2).

关于c - 串口通讯中换行字符的意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53220735/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com