【问题标题】:Serial port reading: Raspberry PI misses data串口读取:树莓派遗漏数据
【发布时间】:2013-12-30 15:28:35
【问题描述】:

我已经连接了一个通过串口发送数据的设备,通过 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 上运行相同的应用程序。

现在,当我在我的树莓派上运行相同的应用程序时,我得到:

0 �Nsnp�Nsnp
0 Nsnp�\��
0 vsnp�^���
0 np�^�O�
0 vsnp�^�O�
0 np�^�D�
0 ssnp�
0 X�snp�dU

看起来覆盆子并没有读完所有的内容,并且变得一团糟。试图挽救有用的日期会导致大量数据丢失。

我已经准备好安装 Rasbian 的精简版了,哎呀。将 X 作为 GUI 卸载。但这似乎没有什么区别。

我相信覆盆子应该足够快。

什么是限制因素?

对于 RasPI 来说,每秒读取 500 行(15 位)的串行速度是否足以应付?

是否有任何我可以更改的设置或树莓派的操作系统可以更好地完成这项工作? 或者在 C++ 中有没有一种方法可以更有效地读取数据?

亲切的问候

【问题讨论】:

  • 如果您每秒只发送一行或几行,它是否能够获取所有内容?此外,您的第二个数据集似乎不是第一个数据集的子集,您确定要发送相同的数据吗?还要考虑到您可能会在 raspberry pi SE site 上找到专门的观众
  • 您是否比较了两台机器上 'stty -a' 的值?
  • 是的,我正在发送相同类型的数据。它是一个测量姿态和加速度的 IMU 设备。因此值可能不同,数据包的长度和数据量应该相同。 stty -a 给出:
  • stty -a 速度 38400 波特;第 22 行;第 80 列;线 = 0;在笔记本电脑上,速度为 38400 波特;第 24 行;第 80 列;线 = 0;在树莓上
  • 感谢 Dennis 的建议,我也会将它发布到树莓堆栈交换中

标签: serial-port raspberry-pi


【解决方案1】:

每秒读取 500 行(15 位)

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

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

这里明显的方法是improve your code,这样您就可以真正检测这些类型的错误,以便您知道什么时候出错。

【讨论】:

  • 谢谢汉斯,我在 tssy 上的第一篇文章不正确,波特率为 115200。
  • 我正在使用 polulu UART 到 USB 转换器。在我的笔记本电脑上,它工作得很好,只是 PI 有问题。是串行连接吗?还是 PI 有点太慢了?
  • 你为什么问我?我不知道,我留下了关于如何知道的非常明确的指导。如果您不知道如何正确编写它,那么只需降低波特率,您就会知道更多。
猜你喜欢
  • 2015-04-26
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 2013-02-08
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多