首页 > 解决方案 > 串口通讯中换行符的意义

问题描述

我们正在测试串口通信。设备上有两个 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 时,我在读取块调用中获取数据。

 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);
}

标签: clinuxserial-portrs485

解决方案


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

尝试使用tcsetattr(). 像这样的东西:

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).

推荐阅读