我正在实现一个简单的可见光通信模块,它有两个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。
非常感谢你。
答案 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 字节:
00000.00000.11111.00000.11111.11111.00000.11111
^^^^^.^^^^!.......^^^^^.^^^^*.......^^^^^.^^^^*
(首先定义LSb ...)0xF0
(首先定义LSb ...)