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

txu3uszq  于 2022-12-03  发布在  Linux
关注(0)|答案(2)|浏览(161)

我有两个程序从串口读取,一些设备连接在另一端。第一个程序使用Qt框架编写,它使用QextSerialPort与串口通信。第二个程序用纯C编写。
问题是这样的:
在系统 Boot 之后,纯C程序在从串行端口阅读数据时出现问题,我知道它会正确发送数据,因为设备会对数据做出React,尽管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

xoefb8l8

xoefb8l81#

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

options.c_cflag &= ~CRTSCTS;

如果仍然不起作用,请查看已接受的答案here;我过去用过几次这个密码,串行通信从来没有出现过任何问题。

2guxujil

2guxujil2#

我知道这个问题是老问题了,但标题中仍然没有原来问题的答案。
因此,是的,串行端口设置在Linux中是持久的,从某种意义上说,从一个进程对端口所做的设置可能对另一个进程可见,即使第一个进程已经结束。
在系统 Boot 过程中重置设置。
此外,还有一个特殊的命令行实用程序可用于查询和设置串行端口设置:stty
例如,要查询串行端口设置,您可以用途:

stty -F /dev/ttyS0

这对于在运行两个应用程序后比较串行端口设置并找出使第二个应用程序正常工作的差异非常有用。

相关问题