最近看到有同学在使用stm32搞lora的串口通信,我也曾使用51、FPGA搞过串口通信。串口也是公认的极其不稳定,大概几百个码(甚至几十个)就会出现错码。
那这个的原因是什么呢?我认为是牺牲了误码率,来换取异步通信系统的低复杂度。
1.第一点在于异步通信,缺少时钟同步
众所周知,最简单的串口通信是检测到起始位的一个0码或1码,连续接收后续的8个码元,而接收码元是通过固定的时钟抽样判决实现的。这样的逻辑在有线基带传输时效果会比较好,因为线路短、频带宽。而在无线远距离传输中,由于频域是有限的,而且信道干扰,因此接收端解调后的波形往往不是那么理想。如下图所示。
至于频域有限为什么会导致码元波形不是矩形,此处不在赘述,详见通信原理。
图里画的就是一种很理想的情况,发送方与接收方的时钟恰好对齐,此时抽样判决的效果就非常好。
但是大部分时候,是对不了那么齐的,往往是下面这种情况。即不在最佳判决门限。
这时候就非常容易发生误码。
2.第二点在于ascll码传输
串口通信一般使用较低的波特率进行传输,最低是9600byte/s,这么低的速率占频带是很窄的,为什么还会误码?因为串口通信是以8位为一组的,错一个码就会导致一组码错误。极大地增加了错码的概率。
3.第三点在于直流分量(maybe)
这一点是猜测的。因为STM32的串口通信是单极性码,零电平和正电平分别对应着二进制代码0和1,因此从频域的角度看,含有非常多的直流分量,这就会使信道中的衰减非常强(直流是最容易被吸收和阻挡的嘛)。
当然,由于我不太懂lora的调制,有可能这一点已经被解决了。即在STM32传输给lora模块时,单极性码可以被转换为双极性码等等。
本人通信小白,只是根据自己的感想和通信原理的所学分析一下,希望批评指正~