【问题标题】:Baud rate arduino波特率arduino
【发布时间】:2016-10-01 20:55:03
【问题描述】:

我正在实现一个简单的可见光通信模块,它有两个 arduino,作为发射器和接收器,包含 120 个字符的短文本消息。我使用了带有开关键控调制的曼彻斯特编码。

总的来说,在我的消息帧中,使用曼彻斯特编码以及前导码和帧结束字节,有 2480 位。我已将一位周期设置为 500 微秒。在接收端,我在 (500/4) 125 微秒处对该位进行了四次采样。据我所知,由于每个比特是 500 我们,有 2000 bits/s 从发射器传输,因此 9600 bits/s 的波特率应该可以工作。但是,9600 不工作,任何高于 38400 到 115200 的波特率都在工作,我可以在接收器中正确解码此短消息。

谁能解释一下我的行为?尽管我每秒只传输 2000 位,但为什么 9600 的波特率不起作用。

更多信息,我已将预分频设置为 128,因此 ADC 采样频率为 (16MHz/128)/13 = 9.6kHz。

非常感谢。

【问题讨论】:

  • 我很困惑。你设置为 9600、38400 还是 115200? Arduino的硬件串口?您是否将光接收器直接馈入 Arduno UART?
  • 是的,串口,在 Serial.begin() 中。抱歉没有说清楚。

标签: arduino-uno baud-rate


【解决方案1】:

当您突然开始谈论“波特率”时,它暗示您正在使用 Arduino 上的硬件串行端口。如果是这样,那么请意识到将 2,000 位/秒 (bps) 输入到预期为 9,600 bps 的设备是有问题的。

异步 ​​UART 的工作方式是等待开始信号(位),然后以当前位速率解码下一个(通常)9 个信号。然后检查第 9 位是否为停止位;如果不是,则丢弃该字节。

由于您只是每 9600/2000 = 4.8 位更改一次,因此第 9 个“停止”位的赔率将是错误的,并且数据会丢失。

我要画一个 ASCII 图表(我没有必要的资源来制作我在这个网站上看到的一些华丽图表...)正在谈论。

  • 我将比特流00101101 用于电路产生的信号,. 作为比特之间的 0ms 分隔符;
  • 我将使用^ 来指出UART 对位进行采样的位置;
  • 我将使用* 来指示“正确”字节(只要字节以正确的停止位结尾);
  • 我将使用! 来指示“不正确”字节(只要字节以不正确的停止位结尾);

当然,我假设波特率为 10,000bps(5 而不是 4.8...)

00000.00000.11111.00000.11111.11111.00000.11111
^^^^^.^^^^!.......^^^^^.^^^^*.......^^^^^.^^^^*

此序列将导致 UART 记录以下 3 个字节:

  1. 错误
  2. 0xF0(先定义 LSb...)
  3. 0xF0(先定义 LSb...)

【讨论】:

  • 感谢您的回答。我不明白你所说的每 4.8 位更改一次。 :( 你能解释一下吗?当使用像 115200 这样的波特率每 57.6 位改变一次时,这有什么不同?
  • 这就是我不明白的 - 为什么更改为 更高 波特率会神奇地起作用。我将用“图表”来放大我的答案——请原谅我的粗鲁。
  • 非常感谢。为了让我的问题更清楚:在发射器端,我将一个 LED 连接到数字引脚 2(不在 TX 引脚中)。在接收器端,光电二极管连接到模拟引脚 3。发送器和接收器的位周期固定为 500 us,发送器和接收器的 Serial.begin(115200)。此外,对于传输的每个字节,我都为它们添加了一个开始位和一个停止位。通过这种加法和曼彻斯特编码,每个传输的字节 = 20 位。我总共传输了 2480 位。
  • 20 位?我了解“曼彻斯特编码”-但这低于每比特率。每个传输的字节不能是 20 位。它要么是 10 位(包括开始和停止),要么是您认为编码错误。是的,每个字节可能有 20 次状态变化——但这本身并不是一个“位”。
猜你喜欢
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多