在使用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錯誤,在接收數據時,數據直接不正常,或者直接觸發接收數據幀錯誤中斷與數據錯誤中斷。
解決辦法:
找到問題的原因后,按照對症,處理硬件與軟件上的缺陷即可。