串口读取:Raspberry PI错过了数据

时间:2013-12-30 15:28:35

标签: serial-port raspberry-pi

我已经连接了一个通过串口发送数据的设备,通过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 ++中有一种方法可以更有效地读取数据吗?

亲切的问候

1 个答案:

答案 0 :(得分:2)

  

每秒读取500行(15次)

即每秒500 x 15 x 10 = 75000位。显然,当您的波特率仅为38400时,这是不可能的。因此,发送器溢出是您第一个数据丢失的候选者。

接收端也有火管问题。您的终端需要能够跟上速率,每秒500线是非常具有挑战性的。滚动窗口足够快是通常的问题,更不用说需要盯着这种矩阵效果的用户眼睛不好。这是更可能的数据丢失源,当您没有足够快地清空串行端口接收缓冲区时,您将遭受缓冲区溢出。当驱动程序没有足够快地清空UART fifo缓冲区时也会发生这种情况,在38400波特时不太可能出现问题。

这里显而易见的方法是improve your code,以便您可以检测这些类型的错误,以便在出错时知道