TTL串口通讯误码的问题
最近用一款51单片机与8266(AT固件)的UART2接口TTL串口通讯, 使用115200的波特率总是每70多个字节或100多个字节出现误码, 8266使用的WROOM-02D模块, 26MHz晶振, 而51使用的是RC震荡.
具体误码的情况是: 8266发送到51不会误码, 而51发送给8266就会误码. 使用电脑HTerm查看, 8266只要启动了AT固件, 51发送的就会误码, 8266不正常启动(如进入烧录模式)或者启动一个啥也不干的空程序, 就不会误码. 怀疑是8266初始化UART2串口以后才有的问题.
尝试了如下各种方法都失败了:
- 尝试将51的波特率降低一半到57600, 仍然误码.
- 尝试将51的波特率改一点点如115201, 结果根本就读不到数据, 这不科学! 难道是硬件串口内置了集中固定的波特率? 因为波特率都需要时钟发生器, 这倒是很有可能无法改一点点.
- 尝试电脑端更改波特率, 发现大约在(115200-3000, 115200+6000)左右都能正确接收, 超出一点儿之后会出现误码,超出太多就全部乱码了. 算下来容忍度有8%左右.
参考了这篇文章, 里面讲到一次不要发的太多. 考虑到每次发送都是在相对固定的位置误码(70个字符以后), 最后成功的方法是:
每次发送50个字符后, 延时5ms再继续发送.
延时时长是反复测试得出的.测试发现每发送50字符延时2.5ms正好可以不误码, 为了容错将这个时间加大一倍为5ms.
硬件上继续尝试解决, 看是否能够找到最终原因.