波特率arduino

时间:2016-10-01 10:05:17

标签: arduino-uno baud-rate

我正在实现一个简单的可见光通信模块,它有两个arduinos,作为发送器和接收器,带有一个由120个字符组成的短文本消息。我使用曼彻斯特编码进行开关调制。

总而言之,在我的消息帧中,使用曼彻斯特编码以及前同步码和帧结束字节,有 2480位。我将一位周期设置为 500微秒。在接收器端,我在(500/4)125微秒时对此位进行四次采样。据我所知,由于每个位为500 us,因此从发送器发送 2000 bit / s ,因此波特率 9600 bit / s 应该有效。但是,9600不工作,任何高于38400到115200的波特率都在工作,我可以在接收器中正确解码这条短消息。

任何人都可以向我解释一下这种行为吗?为什么波特率9600不工作,虽然我只传输2000比特每秒。

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

非常感谢你。

1 个答案:

答案 0 :(得分:1)

当你突然开始谈论"波特率"时,它暗示你正在使用Arduino上的硬件串口。如果是这样,那么就意识到每秒输入2,000比特(bps)到一个预期为9,600 bps的设备有问题。

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

由于您每次只更改9600/2000 = 4.8位,因此第9次"停止"位将是错误的意义,数据将丢失。

我要绘制一张ASCII图表(我不具备本网站上看到的一些华丽图表所需的资源...... )因为我正在谈论的时间。

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

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

!

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

  1. 错误
  2. 00000.00000.11111.00000.11111.11111.00000.11111 ^^^^^.^^^^!.......^^^^^.^^^^*.......^^^^^.^^^^* (首先定义LSb ...)
  3. 0xF0(首先定义LSb ...)