單片機RS-485多機通訊的實(shí)現
另外,在主從機軟件上也應附加若干處理措施,如:上電時(shí)或正式通訊之前,對串行口做幾次空操作,清除端口的非法數據和命令。
2) 控制端RE*,DE的信號的有效脈寬應該大于發(fā)送或接收一幀信號的寬度。
在RS-232,RS-422等全雙工通訊過(guò)程中,發(fā)送和接收信號分別在不同的物理鏈路上傳輸,發(fā)送端始終為發(fā)送端,接收端始終為接收端,不存在發(fā)送、接收控制信號切換問(wèn)題。在RS-485半雙工通訊中,由于SN75176的發(fā)送和接收都由同一器件完成,并且發(fā)送和接收使用同一物理鏈路,必須對控制信號進(jìn)行切換??刂菩盘柡螘r(shí)為高電平,何時(shí)為低電平,一般以單片機的TI,RI信號作參考。
發(fā)送時(shí),檢測TI是否建立起來(lái),當TI為高電平后關(guān)閉發(fā)送功能轉為接收功能;
接收時(shí),檢測RI是否建立起來(lái),當RI為高電平后,接收完畢,又可以轉為發(fā)送。
在理論上雖然行得通,但在實(shí)際聯(lián)調中卻出現傳輸數據時(shí)對時(shí)錯的現象。根據查證有關(guān)資料,并在聯(lián)調中借助存儲示波器反復測試,才發(fā)現一個(gè)值得注意的問(wèn)題,我們可以查看單片機的時(shí)序:
圖3 串行口模式3時(shí)序圖
單片機在串行口發(fā)送數據時(shí),只要將8位數據位傳送完畢,TI標志即建立,但此時(shí)應發(fā)送的第九位數據位(若發(fā)送地址幀時(shí))和停止位尚未發(fā)出。如果在這是關(guān)閉發(fā)送控制,勢必造成發(fā)送幀數據不完整。如果單片機多機通訊采用較高的波特率,幾條操作指令的延時(shí)就可能超過(guò)2位(或1位)數據的發(fā)送時(shí)間,問(wèn)題或許不會(huì )出現。但是如果采用較低波特率,如9600,發(fā)送一位數據需100μs左右,單靠幾條操作指令的延時(shí)遠遠不夠,問(wèn)題就明顯地暴露出來(lái)。接收數據時(shí)也同樣如此,單片機在接收完8個(gè)數據位后就建立起RI信號,但此時(shí)還未接收到第九位數據位(若接收地址幀時(shí))和停止位。所以,接收端必須延時(shí)大于2位數據位的時(shí)間(1位數據位時(shí)間=1/波特率),再作應答,否則會(huì )發(fā)生總線(xiàn)沖突。
3) 總線(xiàn)上所連接的各單機的發(fā)送控制信號在時(shí)序上完全隔開(kāi)。
為了保證發(fā)送和接收信號的完整和正確,避免總線(xiàn)上信號的碰撞,對總線(xiàn)的使用權必須進(jìn)行分配才能避免競爭,連接到總線(xiàn)上的單機,其發(fā)送控制信號在時(shí)間上要完全隔離。
總之,發(fā)送和接收控制信號應該足夠寬,以保證完整地接收一幀數據,任意兩個(gè)單機的發(fā)送控制信號在時(shí)間上完全分開(kāi),避免總線(xiàn)爭端。
程序流程框圖,參見(jiàn)圖4。其中:a)為發(fā)送流程圖;b)為接收流程圖。
圖4 程序流程圖
注:延時(shí)T秒的取值
(1) 傳送地址幀時(shí),T>2X(1/波特率),可以選取T=2.5X(1/波特率)。
(2) 傳送數據幀時(shí),T>1X(1/波特率),可以選取T=1.5X(1/波特率)。
評論