用于UART设备的带termios(CRTSCTS)的硬件流控制 现在我在UDO-Neo上用C++与UART设备通信。为此,我使用termios设置连接并将数据写入设备。 为此,我想使用硬件流控制,并用termios设置了标志(CRTSCTS)

用于UART设备的带termios(CRTSCTS)的硬件流控制 现在我在UDO-Neo上用C++与UART设备通信。为此,我使用termios设置连接并将数据写入设备。 为此,我想使用硬件流控制,并用termios设置了标志(CRTSCTS),c++,uart,flow-control,termios,C++,Uart,Flow Control,Termios,对于hardaware流量控制,我已经将设备RTS线路连接到CTS板,并且我还通过示波器检查,如果设备未准备好读取,设备是否给我一个活动高电平 问题是,在下面的示例中,我仍然丢失了字节,只是用数字滥发设备,但电路板的输出表明所有内容都写得正确 我认为UART在使用HW流控制时会被阻塞,因此不会丢失任何信息。我是否理解不正确?或者代码中是否有错误 谢谢你的帮助 const char dev[] = "/dev/ttymxc4"; int main(int argc, char **argv) {

对于hardaware流量控制,我已经将设备RTS线路连接到CTS板,并且我还通过示波器检查,如果设备未准备好读取,设备是否给我一个活动高电平

问题是,在下面的示例中,我仍然丢失了字节,只是用数字滥发设备,但电路板的输出表明所有内容都写得正确

我认为UART在使用HW流控制时会被阻塞,因此不会丢失任何信息。我是否理解不正确?或者代码中是否有错误

谢谢你的帮助

const char dev[] = "/dev/ttymxc4";

int main(int argc, char **argv) {

int fd;
struct termios t; ///< control structure for a general asynchronous interface
// edited code
tcgetattr(fd, &t);

t.c_iflag &= ~(IGNBRK | BRKINT | ICRNL |
                 INLCR | PARMRK | INPCK | ISTRIP | IXON);
t.c_oflag = 0;
t.c_cflag &= ~(CSIZE | PARENB);
t.c_cflag |= (CS8 | CRTSCTS);

// edited code 
t.c_cflag |= (CLOCAL | CREAD);

t.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG);

t.c_cc[VMIN]  = 0;
t.c_cc[VTIME] = 0;

cfsetispeed(&t,B57600); /* normal shall be: B115200 Baud */

fd = ::open(dev, O_RDWR);
if (fd==-1) {
    printf("UART: cannot open file: %s\n",dev);
    return -1;
}

tcsetattr(fd,TCSANOW, &t);

// edited code
fcntl(fd, F_SETFL, 0);

int count = 0;
while (true) {

    count++;
    std::stringstream output;
    output << count << ",";

    ::write(fd, output.str().c_str(), output.str().length());
    printf("%d, writing: %s\n", fd, output.str().c_str());
    usleep(10000);
}
return 0;
const char dev[]=“/dev/ttymxc4”;
int main(int argc,字符**argv){
int-fd;
struct termios t;//<通用异步接口的控制结构
//编辑代码
tcgetattr(fd和t);
t、 c|U iflag&=~(IGNBRK | BRKINT | ICRNL)|
INLCR | PARMRK | INPCK | ISTRIP | IXON |);
t、 Lag的c_=0;
t、 c|cflag&=~(CSIZE | PARENB);
t、 c|cflag |=(CS8 | CRTSCTS);
//编辑代码
t、 c|cflag |=(CLOCAL | CREAD);
t、 c|lflag&=~(ECHO | ECHONL | ICANON | IEXTEN | ISIG);
t、 c_cc[VMIN]=0;
t、 c_cc[VTIME]=0;
cfsetispeed(&t,B57600);/*正常值应为:B115200波特*/
fd=::打开(dev,O_RDWR);
如果(fd==-1){
printf(“UART:无法打开文件:%s\n”,dev);
返回-1;
}
tcsetattr(fd、TCSANOW和t);
//编辑代码
fcntl(fd,F_SETFL,0);
整数计数=0;
while(true){
计数++;
std::stringstream输出;

输出参考@sawdust的链接,HW流量控制通过

CCTS\u of low
CRTS\u IFLOW
via

宏:tcflag\u t
CCTS\u of low

如果设置了该位,则启用基于CTS导线(RS232协议)的输出流量控制。
宏:tcflag\u t
CRTS\u IFLOW

如果设置了该位,则启用基于RTS导线(RS232协议)的输入流量控制

CNEW\u RTSCTS
CRTSCTS
via

某些版本的UNIX支持使用CTS进行硬件流控制 (清除发送)和RTS(请求发送)信号线。如果 然后在系统上定义CNEW_RTSCTS或CRTSCTS常量 可能支持硬件流控制。请执行以下操作以 启用硬件流控制:

options.c_cflag |= CNEW_RTSCTS;    /* Also called CRTSCTS */
请注意,“某些版本…”和“…可能受支持。”

在我的特定交叉编译工具链(
Linaro GCC 6.5-2018.12
)上,如果我对这些值进行grep,
CRTSCTS
没有记录,而是定义,
CCTS\u of low
在很多信息文件中,但没有头文件

libc/usr/include/bits/termios.h:
174:# define CRTSCTS  020000000000              /* flow control */
正如你在评论中所说的那样

…我以为这会由内核来处理


我看到了这样一种现象,即使我在设备树中添加了相关的rts/cts属性(
{rts,cts}-gpios
uart有RTSCT
),命令stty-a-F/dev/ttyS仍然返回
-crtscts
,这意味着RTS/CTS握手被禁用,因此即使没有用户空间应用程序,这似乎也不是一个简单的配置。(内核5.4)

引用@sawdust的链接,HW流控制通过

CCTS\u of low
CRTS\u IFLOW
via

宏:tcflag\u t
CCTS\u of low

如果设置了该位,则启用基于CTS导线(RS232协议)的输出流量控制。
宏:tcflag\u t
CRTS\u IFLOW

如果设置了该位,则启用基于RTS导线(RS232协议)的输入流量控制

CNEW\u RTSCTS
CRTSCTS
via

某些版本的UNIX支持使用CTS进行硬件流控制 (清除发送)和RTS(请求发送)信号线。如果 然后在系统上定义CNEW_RTSCTS或CRTSCTS常量 可能支持硬件流控制。请执行以下操作以 启用硬件流控制:

options.c_cflag |= CNEW_RTSCTS;    /* Also called CRTSCTS */
请注意,“某些版本…”和“…可能受支持。”

在我的特定交叉编译工具链(
Linaro GCC 6.5-2018.12
)上,如果我对这些值进行grep,
CRTSCTS
没有记录,而是定义,
CCTS\u of low
在很多信息文件中,但没有头文件

libc/usr/include/bits/termios.h:
174:# define CRTSCTS  020000000000              /* flow control */
正如你在评论中所说的那样

…我以为这会由内核来处理


我看到了这样一种现象,即使我在设备树中添加了相关的rts/cts属性(
{rts,cts}-gpios
uart有RTSCT
),命令stty-a-F/dev/ttyS
仍然返回
-crtscts
,这意味着RTS/CTS握手被禁用,因此即使没有用户空间应用程序,这似乎也不是一个简单的配置。(内核5.4)

(1)未初始化使用termios结构。从未调用tcgetattr()termios结构初始化未完成。仅指定了输入波特率。CREAD和CLOCAL未正确设置。VMIN=0和VTIME=0被认为有问题。(3)fcntl()缺少一个参数。感谢帮助-我添加了更改。-tcgetattr(fd,&t);-t.c_cflag |=(CLOCAL | CREAD);-fcntl(fd,F|SETFL,0);当运行测试时,我仍然在丢失软件包。当手动检查CTS信号时(使用ioctl)我明白了,CTS设置为活动/非活动,因此我甚至可以通过手动检查标志来完成所有包。我只是认为这将由内核处理?编辑您的帖子以显示修订后的代码以供审阅。刚刚更新了原始帖子,所有更改都有//edited code注释。再次感谢;)研究和检查从每个系统调用返回错误代码。例如,在分配
fd
之前执行tcgetattr()。(1)使用termios结构