RS485通讯介绍(附批量测试思路)
前言
做嵌入式開發的無論軟件還是硬件,應該經常聽見這樣一個概念“485協議”,但是呢,去查資料又發現好多人說“485要跑modbus協議”,姑且不論modbus是什么,協議上跑協議,有點暈。到底是怎么回事呢,請往下看。
485通訊標準
485是電氣特性規定為2線,半雙工,多點通信的的標準,它的電氣特性和RS232不太一樣,用纜線兩端的電壓差值來表示傳遞信號,RS485僅僅規定那個了接收端和發送端的電氣特性,它沒有規定或推薦任何數據協議(注意這句話:僅僅規定了特性,沒規定協議)。
RS485特點:
1.接口電平低,不易損壞芯片,邏輯“1” :VA-VB>+200mv;邏輯“0”:VA-VB<-200mv;|VA-VB|<200mv,總線電平不確定(網上有些資料敘述錯誤,誤人子弟,大家可以網上搜一款485芯片,對照手冊來確定邏輯電平和電壓差的關系),接口電平比RS232降低了。
2.傳輸速率高,10 米時, RS485 的數據最高傳輸速率可達 35Mbps,在 1200m 時,傳輸速度可達 100Kbps。
3.抗干擾能力強,RS485 接口是采用平衡驅動器和差分接收器的組合,抗共模干擾能力增強,即抗噪聲干擾性好。
4.傳輸距離遠,支持節點多, RS485 總線最長可以傳輸 1200m 以上(速率≤100Kbps)一般最大支持 32 個節點,如果使用特制的 485 芯片,可以達到 128 個或者 256 個節點,最大的可以支持到 400 個節點。
注意:
1.485推薦使用在線型,總線型網絡,而不能是星型,環形網絡(牽扯到信號反射,造成干擾),2.傳輸距離比較遠的情況下RS485需要2個終端匹配電阻,其阻值要求等于傳輸電纜的特性阻抗120歐姆。(485通訊硬件設計注意事項比較多,稍有不慎就可能對通信造成很大的干擾,要多查資料)
3.具體使用的時候,使用相應的485芯片作為收發器,比如SP3485,max485等
modbus協議
去網上搜modbus,關于該協議的介紹可能一大推,其實就一句話:modbus定義了一種數據幀格式:幀頭---地址---功能碼---數據---CRC校驗,注意:協議是一種很靈活的東西,目的是定義數據通訊的格式,上面這個是標準的modbus通訊協議,具體應用的時候可以根據實際需要進行裁剪,比如加個幀尾,比如換成其他的校驗方式。
所以,大家現在應該對485和modbus的關系有所認識了吧,我們可以把485總線單純地理解為硬件通路,它具有自己的電氣特性,所有的設備都可以掛在上面,每個設備有唯一的地址,和串口通信不同的是由于485有專門的控制收發引腳,所以代碼里面每次發送前后都要對該控制引腳進行控制。此外軟件上注意延時(電平穩定);modbus其實可以理解為硬件公路上的車,它本身就是個軟件協議,規定上位機和下位機數據以什么樣式進行傳輸。
硬件連接
下面是我用VISIO畫的基本框圖
引腳介紹
RX MCU接收管腳
TX MCU發送管腳
IO MCU控制485收發的管腳
RO 屬于485芯片的發送管腳
DI 屬于485芯片的接收管腳
CTL 是485芯片的控制管腳(實際上是485兩個控制管腳接在一起,當IO輸出低電平,mcu接收數據,當IO輸出高電平,mcu發送數據)
軟件編寫
我們做了一個485批量測試軟件,測試板上放了16個mcu,通過485協議,PC端讀取每個模組的測試數據,基本思路如下
1.通過測試板硬件,固定測試板每個模組的地址,然后由mcu去讀各自的Address
2.配置串口接收中斷
將模組配置成串口中斷模式,接收PC端發的指令,然后在中斷中執行一些操作,將數據上傳到PC
基本協議如下
3.串口中斷函數
uint8_t gRxbuf[4] = {0}; //define the array to store received data void USART1_IRQHandler(void) { uint8_t k,data = 0;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){data = USART_ReceiveData(USART1);if(data == 0x19)gRxbuf[0] = data; else if(data == 0x20)gRxbuf[1] = data;else if(data < 0x19)gRxbuf[2] = data;else if(data > 0x20)gRxbuf[3] = data;if(gRxbuf[3] != 0) //當此判斷條件成立時,表示接收到一條完整的指令{if ((gRxbuf[0] == 0x19)&&(gRxbuf[1] == 0x20)&&(gRxbuf[2] == RS485_address)) //確保指令正確性{ if(0x69 == gRxbuf[3]) //對應當功能碼為0x69時執行的操作{/***************其余操作*********************************/RS485_TX_EN = 1; //給485控制管腳高電平,發送數據delay_ms(1); //延時1ms等485切換控制管腳的電平穩定/***************發送操作*******************/delay_ms(1); //延時1ms等485切換控制管腳的電平穩定RS485_TX_EN = 0;gRxbuf[0] = 0; //處理完畢將存儲指令的數組清空復位 gRxbuf[1] = 0;gRxbuf[2] = 0;gRxbuf[3] = 0;} if(0x89 == gRxbuf[3]) //對應當功能碼為0x89時執行的操作{/***************其余操作*********************************/RS485_TX_EN = 1;delay_ms(1);/***************發送操作*******************/delay_ms(5);RS485_TX_EN = 0;gRxbuf[0] = 0;gRxbuf[1] = 0;gRxbuf[2] = 0;gRxbuf[3] = 0;} }else //當功能碼既不是0x69也不是0x89時,不做任何操作{gRxbuf[0] = 0;gRxbuf[1] = 0;gRxbuf[2] = 0;gRxbuf[3] = 0;} }} }此處說一下地址的作用:比如PC向總線發了一個測試指令0x19 0x20 0x00 0x69,485總線上的所有設備都可以收到這四個字節,然后通過軟件編寫,485設備會將接收到的指令的地址碼即0x00和它們自己的地址做比較,當一樣時知道是發給自己的,當不一樣時不做任何回應,從而實現訪問485總線的多點通信。
總結
以上是生活随笔為你收集整理的RS485通讯介绍(附批量测试思路)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SPR传感原理(附Matlab源码)
- 下一篇: 搭建turn服务器