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

Posted

技术标签:

【中文标题】Linux 中的串口设置是永久的吗?【英文标题】:Are serial port settings permanent in Linux? 【发布时间】:2014-01-30 09:43:54 【问题描述】:

我有两个程序要从串口读取,另一端连接了一些设备。 第一个程序是使用 Qt 框架编写的,它使用 QextSerialPort 与串行通信。第二个程序是用纯 C 编写的。

问题是这样的:

系统启动后,纯C程序在从串口读取数据时出现问题,我知道它可以正确发送数据,因为设备会对数据做出反应,尽管pselect(即监控serial_fd)永远不会返回serial_fd以从设备读取数据.

当我启动第二个程序(用 Qt 编写)时,它会立即从设备发送和接收数据,没问题。

更重要的是,在我启动 Qt 程序,然后是纯 C 程序后,纯 C 突然可以完美运行,直到我再次重新启动系统。 所以看起来Qt编写的程序在初始化过程中会永久更改一些串口设置,这可能吗?

下面是Qt程序中初始化串口的sn-p代码:

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】:

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

options.c_cflag &= ~CRTSCTS;

如果还是不行,看看接受的答案here;我过去曾多次使用该代码,并且从未遇到过串行通信问题。

【讨论】:

以上是关于Linux 中的串口设置是永久的吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置ubuntu系统的串口输出

ARM的UART中,啥是FIFO模式,在进行串口通信时不是一定要用到FIFO的吗?对于UTRSTATn很不理解。谢谢

source命令 与 设置环境变量的四个文件 (设置永久环境变量)

linux怎么设置永久路由

如何在 Linux 中永久设置环境变量

linux 串口编程记录串口参数设置