问题描述
我尝试在 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;
很可能不是您想要做的事情(将引发所有标志,除了选定的标志)。