为什么当我尝试设置串口时,函数返回“输入/输出错误”?

问题描述

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

解决方法

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

我在这里看到了一些其他问题。

您不会检查 tcgetattr() 是否成功,因此即使到达 tcsetattr() 也不要太确定。

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