【问题标题】:Why when I try set serial port, function return "Input/output error"?为什么当我尝试设置串口时,函数返回“输入/输出错误”?
【发布时间】:2021-02-03 19:50:51
【问题描述】:

我尝试在 C++ 中设置一些串行端口,但是当我尝试函数 tcsetatrr 时,它的返回错误 -1。端口打开没有问题。

char port_name[] = "/dev/ttyS1";

int port = open(port_name, O_RDWR | O_NOCTTY | O_NDELAY);
if(port < 0){
    std::cout << "Cant open port" << std::endl;
    return;
}

struct termios settings;
tcgetattr(port, &settings);

cfgetispeed(&settings);
//std::cout << settings.c_cflag;

//Baudrate
cfsetispeed(&settings, B115200);
cfsetospeed(&settings, B115200);

//Data bits
settings.c_cflag &= ~CSIZE;
settings.c_cflag |= CS8;

//Parity
settings.c_cflag |= ~PARENB;

//Stop bit
settings.c_cflag &= ~CSTOPB;

//Flow control
settings.c_cflag |= ~CRTSCTS;
settings.c_iflag &= ~(IXON | IXOFF | IXANY);

int er = tcsetattr(port, TCSANOW, &settings);
if (er<0) {
    fprintf(stderr, "Error openinig: %s\n", strerror(errno));
}

close(port);

输出:

Input/output error

我该如何解决这个问题?我以root身份运行代码。问题不在于设置结构的配置,因为在将其注释掉后,我得到了同样的错误

【问题讨论】:

  • 您是否尝试以root身份运行代码,您可能没有配置设备的权限。
  • “问题不在于设置结构的配置,因为...” -- 然后发布minimal,可重现的示例。您的程序还应该检查 tcgetattr() 的返回码。

标签: c++ linux linux-kernel serial-port embedded


【解决方案1】:

最可能的答案是you don't really have a serial device /dev/ttyS1。尝试 /dev/ttyS0 代替。我的电脑上也有同样的交易。

我在这里发现了一些其他问题。

你不检查tcgetattr() 是否成功,所以不要太确定你是否到达tcsetattr()

调用settings.c_cflag |= ~PARENB;settings.c_cflag |= ~CRTSCTS; 很可能不是您想要做的(将引发所有标记,除了选定的标记)。

【讨论】:

    猜你喜欢
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2019-01-28
    • 1970-01-01
    相关资源
    最近更新 更多