我正在尝试使用QSerialPort来实现简单串行通信协议的一面。协议接收端的单板不在我的控制范围内,所以我试图通过使用空的DE-9电缆在同一块板上从一个串口回送到另一个串口来调试我的一面,并运行一个简单的"听者"应用程序依赖于相同的底层传输协议代码。
传输协议要求立即发送"确认"当收到有效的消息包时,数据包,所以端口总是以读/写模式打开,并且在每个消息包发送后,代码等待并侦听确认;在超时期限过去之前,端口不会再次关闭。 编辑4:端口是,但是,当程序未尝试发送消息或专门侦听数据时,它将关闭。
我发现代码的行为有所不同,具体取决于运行Qt程序之前端口的波特率是否与Qt程序选择的波特率相匹配。也就是说,我使用setBaudRate()
(在发件人和监听器中)来确定波特率,如果我在运行程序之前将其设置为的任何内容,然后监听器会看到正确的字节序列,但如果我将其设置为其他字符序列,那么监听器就会看到串口上的垃圾。
(即使听众看到了正确的字节序列并发送了ack,其他程序也看不到这些ack,我不知道为什么;我怀疑这个问题可能是相关的,但对于这个问题它& #39;不是我的重点。)
实际使用的是什么波特率似乎无关紧要;我只需要在运行Qt程序之前使用stty
设置它,即使 Qt程序明确设置了波特率。如果我使用stty
将波特率设置为Qt程序使用的以外的其他东西,那么监听器就会看到垃圾。
我在设置后为每个端口打印了baudRate(Input)
,baudRate(Output)
,dataBits()
,flowControl()
,parity()
和stopBits()
的值波特率是为了评估波特率是否未正确设置或串口的某些其他属性是否不正确,但打印的值在每种情况下都是相同的。
我已经使用stty
的其他属性进行了实验(尽管不是很广泛)(例如在运行我的程序之前将两个端口都设置为raw
或cooked
),并且观察到没有除波特率以外的设置似乎有任何影响。
有没有人知道这里可能会发生什么,如何调试它,以及QSerialPort或QSerialPortInfo是否提供了正确的工具来解决所显示的任何不一致问题?
编辑:为了澄清,我知道 Qt波特率设置代码 有一些影响,因为远程端协议(不受我控制的协议)使用57600波特,在使用Qt(不是stty
)更改后,我可以使用该硬件发送和接收一些消息我的端口的波特率从默认的9600到57600.(如果我不改变波特率,则无法进行通信;我得到的字符与硬件实际发送的字符不匹配。)
还应该清楚的是,如果在我的程序中设置波特率没有影响,环回测试将始终有效,Qt代码会产生一些影响。
编辑2: 在设置波特率之前,Qt显然将baudRate()
确定的速率感知为9600(默认速率), 无论是如何stty
设置的。
另外,如果我使用stty
设置"发送"一边是'#34;右边"波特率和"听"一边走错了#34;波特率,当两个端口都被设置为"错误"时,我得到部分正确的行为。提前率(即听众看到消息,但发送者永远不会看到确认)。
编辑3:我之前有一个编辑,注意到其中一些测试是在拔掉环回电缆的情况下完成的,但我刚刚意识到我错了。
Qt版本: 5.4.0
操作系统: Debian 7
答案 0 :(得分:1)
事实证明,由于我正在打开和关闭端口,我正在丢失数据。当QSerialPort
关闭时,数据首先不是缓存(由驱动程序),或者在重新打开端口后立即丢弃。
据推测,使用stty
设置波特率以匹配Qt
使用的波特率影响程序行为的原因是,当波特率已经是Qt
需要的时候要设置它,setBaudRate()
调用是一个无操作,并且在关闭恢复旧波特率时不需要清理操作;而当Qt
需要更改波特率时,它必须还在关闭端口时恢复旧的波特率,这会占用大量的处理时间。