在使用GD32/STM32做一次串口接收发送的DMX信号的系统时,发现一个有意思的现象:
问题现象:
1. 当发送端的的波特率设置为250kbps时,经过隔离发送电路或者信号线传输后,串口起始位第一个低电平理论山应该时4us,经过信号切换延与线路上的阻容电路衰减后,势必造成起始位的时间不是严格的4us,在隔离电路切换时,如果使用的隔离电路切换速度不够足够及时,实测4us的时间将会缩短到4us一下,但是整个帧的时间包括1个起始位,8个数据位,两个停止位的时间任然是44us。
2. 接收端在接收该帧数据时,如果按照正常的逻辑,在识别到起始位都数据,在数据不超过255时,读取数据单片机是认为是正确的,也能正常显示,但是当发送数据为255时,接收端的数据按照默认将读出的时0。
原因分析:
1. 对于发送端,处理发送电路问题,找到信号没有按照正确的时序发出4us的起始电平的原因,一般是发送端光耦速度达不到切换的要求或者是触发光耦关断的电路存在跟不上时序的问题。
2. 对于接收端,在实际电路中,如果碰到干扰,或者发送端信号衰减,碰到这样的问题是不可避免的,特别是随着信号线的拉长,虽然在RS485电路中,要求加终端电阻,加上拉电阻等措施采取提升信号接收能力,但是市面上的各个厂家为节省成本考虑或者未考虑该问题,都将会造成接收端信号不问题,起始位的4us要么被拉长,要么被缩减,导致接收端接收程序发生两种错误中断的产生:
(1)接收端起始位时间小于4us错误,在接收数据为255时,将触发溢出中断,原因是读取的数据位将会加一位,最后实际的数据位是0x1ff(串口配置为8位数据位,2位停止位接收的情况)或者0x3ff(串口配置为9位数据位,1位停止位接收的情况)
(2)接收端起始位时间大于4us错误,在接收数据时,数据直接不正常,或者直接触发接收数据帧错误中断与数据错误中断。
解决办法:
找到问题的原因后,按照对症,处理硬件与软件上的缺陷即可。