我已经连接了一个通过串口发送数据的设备,通过UART和USB连接器。
在运行ubuntu的笔记本电脑上,我编写了一个C ++程序来读取这些数据并存储它。 它发送5行15个咬,每秒100次,意思是:每秒500行。
我使用标准读取命令:
while((res += read(IMU, header, 15-res)) < 15);
string head(header, 15);
cout << indexLog << " " << head << endl;
当我读取串口并读取15个叮咬时,它显示:
0 snp�` �����
0 snp�b#A��H
0 snp�dP�O�^���
0 snp�\����f
0 snp�^���e��M
0 snp�` �����
0 snp�b"����
其中snp是每个包的开头。可以看出,我的笔记本电脑很好地读取了所有进入的内容,因为每行都以snp开头。
我想在Raspberry PI上运行相同的应用程序,考虑重量和尺寸。
现在,当我在我的树莓PI上运行相同的应用程序时,我得到:
0 �Nsnp�Nsnp
0 Nsnp�\��
0 vsnp�^���
0 np�^�O�
0 vsnp�^�O�
0 np�^�D�
0 ssnp�
0 X�snp�dU
看起来覆盆子没有读完所有的叮咬,它变得一团糟。试图挽救有用的日期会导致大量数据丢失。
我已经准备好安装一个脱脂版的Rasbian,weezy。将X卸载为GUI。但它似乎没有区别。
我相信树莓应该足够快。
什么是限制因素?
对于RasPI来说,每秒读取500行(15次)只是为了应对RasPI吗?
我可以更改任何设置或覆盆子的操作系统可以更好地完成工作吗? 或者在C ++中有一种方法可以更有效地读取数据吗?
亲切的问候
答案 0 :(得分:2)
每秒读取500行(15次)
即每秒500 x 15 x 10 = 75000位。显然,当您的波特率仅为38400时,这是不可能的。因此,发送器溢出是您第一个数据丢失的候选者。
接收端也有火管问题。您的终端需要能够跟上速率,每秒500线是非常具有挑战性的。滚动窗口足够快是通常的问题,更不用说需要盯着这种矩阵效果的用户眼睛不好。这是更可能的数据丢失源,当您没有足够快地清空串行端口接收缓冲区时,您将遭受缓冲区溢出。当驱动程序没有足够快地清空UART fifo缓冲区时也会发生这种情况,在38400波特时不太可能出现问题。
这里显而易见的方法是improve your code,以便您可以检测这些类型的错误,以便在出错时知道。