问题描述
在打开串口后,使用fread()
间歇读取串口数据,读取的数据有较大的延迟,三四次才能读取到当前数据。
(版本:R2018b,串口对象:‘serial’)
串口虽然有延迟,但数据是没有丢失的,不难怀疑是缓冲区的原因。
注意到serial
对象有这样一个属性,被我配置为‘continue’
也就是说,无论有无用fread()
读取串口数据,Matlab都在持续的接收串口数据并写入内置缓冲区,使用fopen()
实际是从缓冲区中读取数据。
解决方法
在每次读取串口前,重新打开串口,读取数据后再关闭串口。
但是要注意,每次打开串口后都会新创建一个串口对象
可以用delete(串口对象)
删除单个串口,或用delete(instrfind)
函数删除所有串口对象
除此之外,还可以尝试以下手段:
- 使用清空缓冲区函数—— flush(点击访问),但只在2019b以上的版本有,因本机版本过低故没有尝试。
- 调整接收缓冲区大小——InputBufferSize(点击访问),用多次短读取代替一次长读取,延迟问题没有明显改善。
重新看了一下官方文档对InputBufferSize的解释,可以理解为一次fread()传输的最大长度,对底层定义的串口缓冲区没有影响。