首页 > 解决方案 > 为什么当我尝试设置串口时,函数返回“输入/输出错误”?

问题描述

我尝试在 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身份运行代码。问题不在设置结构的配置中,因为在将其注释掉后,我得到了同样的错误

标签: c++linuxlinux-kernelserial-portembedded

解决方案


最可能的答案是您实际上并没有串行设备 /dev/ttyS1。尝试 /dev/ttyS0 代替。我的电脑上也有同样的交易。

我在这里看到了一些额外的问题。

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

跟注settings.c_cflag |= ~PARENB;orsettings.c_cflag |= ~CRTSCTS;很可能不是您想要做的(将引发除所选标志之外的所有标志)。


推荐阅读