我有两个程序要从串口读取,另一端连接了一些设备。第一个程序是使用 Qt 框架编写的,它使用 QextSerialPort 与串行通信。第二个程序是用纯 C 编写的。
问题是这样的:
系统启动后,纯 C 程序在从串口读取数据时出现问题,我知道它可以正确发送数据,因为设备会对数据做出反应,尽管 pselect(即监视 serial_fd)永远不会返回 serial_fd 从设备读取数据。
当我启动第二个程序(用 Qt 编写)时,它会立即从设备发送和接收数据,没问题。
更重要的是,在我启动 Qt 程序,然后是纯 C 程序后,纯 C 突然完美地工作,直到我再次重新启动系统。所以看起来用Qt编写的程序在初始化期间会永久更改一些串口设置,这可能吗?
下面是初始化串口的 Qt 程序的代码片段:
if (rs232->open(QIODevice::ReadWrite)) {
rs232->setBaudRate(BAUD38400);
rs232->setFlowControl(FLOW_OFF);
rs232->setParity(PAR_NONE);
rs232->setDataBits(DATA_8);
rs232->setStopBits(STOP_1);
connect(rs232, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
} else {
qDebug() << "Rs232::rs232Connect OPEN PORT FAILURE";
exit(1);
}
这是来自纯 C 程序:
fd = open("/dev/ttyAMA0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
/*
* Could not open the port.
*/
error_exit(ERROR,"open_port: Unable to open /dev/ttyAMA0");
}
else
fcntl(fd, F_SETFL, 0);
/*
* Get the current options for the port...
*/
tcgetattr(fd, &options);
/*
* Set the baud rates to 19200...
*/
cfsetispeed(&options, B38400);
cfsetospeed(&options, B38400);
/*
* Enable the receiver and set local mode...
*/
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
/*
* Set the new options for the port...
*/
tcsetattr(fd, TCSANOW, &options);
有什么遗漏还是什么?
最好的问候马雷克