C-是Linux永久串行端口设置



我有两个程序可以从串行端口读取,另一端连接了一些设备。第一个程序是使用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);

是否缺少或什么?

最好的问候Marek

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

options.c_cflag &= ~CRTSCTS;

如果它仍然不起作用,请在此处查看所接受的答案;我过去几次都使用过代码,并且从未在串行通信方面遇到任何问题。

我知道这个问题是旧的,但是标题中的原始问题仍然没有答案。

因此,是的,串行端口设置在Linux中持续存在,即使从一个过程对端口进行的设置也可以看到另一个过程,即使第一个过程已经结束。

在系统启动过程中重置设置。

另外,还有一个特殊的命令行实用程序来查询并设置串行端口设置:stty。

,例如,要查询串行端口设置,您可以使用:

stty -F /dev/ttyS0

在您的情况下,在运行两个应用程序后比较串行端口设置可能很有用,并找到使第二个应用程序起作用的差异。

相关内容

  • 没有找到相关文章

最新更新