我正在实现一个简单的可见光通信模块与两个Arduino,作为一个发射机和接收器,一个简短的短信由120个字符组成。我使用了曼彻斯特编码和开关-keying调制.
总之,在我的消息帧中,使用曼彻斯特编码、前导和帧尾字节,总共有2480位。我把一位周期设为500微秒。在接收端,我在(500/4) 125微秒时,对这个位进行了四次采样。据我所知,由于每比特是500μs,有2000位/s正在从发射机传输,所以波特率为9600比特/秒应该可以工作。然而,9600没有工作,任何波特率超过38400至115200是工作的,我可以正确地解码这条短消息在我的接收器。
对这种行为的解释是什么?为什么波特率9600不能工作,虽然我只传输2000位每秒?
进一步信息:我已将预标量设置为128,因此ADC采样频率为(16 MHz/128)/13=9.6kHz。
发布于 2016-10-01 11:03:01
当您突然开始谈论“波特率”时,这意味着您正在使用Arduino上的硬件串行端口。如果是这样的话,然后意识到将2,000位/秒输入到期望9,600位/秒的设备中是有问题的。
异步UART的工作方式是等待启动信号(位),然后以当前比特率解码下一个(通常)9个信号。然后,它检查第9位是否为停止位;如果不是,则丢弃该字节。
因为你只改变每9600/2000 = 4.8位,那么第9个“停止”位的赔率将是错误的,数据就会丢失。
下面是一个ASCII的时间图,我正在谈论。
00101101来处理电路产生的信号,.作为位之间的0 ms分隔符;^来指出UART在哪里采样这些位;*来表示“正确”字节(只要字节以正确的停止位结尾);!来表示一个“不正确的”字节(如果字节以一个不正确的停止位结尾);当然,我假设波特率为10,000比特/秒(5,而不是4.8.)
00000.00000.11111.00000.11111.11111.00000.11111
^^^^^.^^^^!.......^^^^^.^^^^*.......^^^^^.^^^^*此序列将导致UART记录以下3字节:
0xF0 (首先定义了LSB.)0xF0 (首先定义了LSB.)https://stackoverflow.com/questions/39805311
复制相似问题