Linux中的串口设置是永久性的吗?

时间:2014-01-30 09:43:54

标签: c linux qt serial-port qextserialport

我有两个程序要从串口读取,有些设备在另一端连接。 第一个程序是使用Qt框架编写的,它使用QextSerialPort与serial进行通信。第二个程序是用纯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);

是否有遗漏或什么?

最好的问候 马立克

1 个答案:

答案 0 :(得分:0)

我正在抓住这里的吸管,但在做其他任何事情之前,我建议将另一个终端连接到另一边,看看是否有任何事情发生。您的问题可能是您未在C应用程序中设置流控制模式的事实,请尝试

options.c_cflag &= ~CRTSCTS;

如果仍然无效,请查看已接受的答案here;我过去曾经使用过这些代码,并且从未遇到任何串行通信问题。