日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RS485通讯介绍(附批量测试思路)

發(fā)布時間:2024/8/1 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RS485通讯介绍(附批量测试思路) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

做嵌入式開發(fā)的無論軟件還是硬件,應(yīng)該經(jīng)常聽見這樣一個概念“485協(xié)議”,但是呢,去查資料又發(fā)現(xiàn)好多人說“485要跑modbus協(xié)議”,姑且不論modbus是什么,協(xié)議上跑協(xié)議,有點暈。到底是怎么回事呢,請往下看。

485通訊標準

485是電氣特性規(guī)定為2線,半雙工,多點通信的的標準,它的電氣特性和RS232不太一樣,用纜線兩端的電壓差值來表示傳遞信號,RS485僅僅規(guī)定那個了接收端和發(fā)送端的電氣特性,它沒有規(guī)定或推薦任何數(shù)據(jù)協(xié)議(注意這句話:僅僅規(guī)定了特性,沒規(guī)定協(xié)議)。
RS485特點:
1.接口電平低,不易損壞芯片,邏輯“1” :VA-VB>+200mv;邏輯“0”:VA-VB<-200mv;|VA-VB|<200mv,總線電平不確定(網(wǎng)上有些資料敘述錯誤,誤人子弟,大家可以網(wǎng)上搜一款485芯片,對照手冊來確定邏輯電平和電壓差的關(guān)系),接口電平比RS232降低了。
2.傳輸速率高,10 米時, RS485 的數(shù)據(jù)最高傳輸速率可達 35Mbps,在 1200m 時,傳輸速度可達 100Kbps。
3.抗干擾能力強,RS485 接口是采用平衡驅(qū)動器和差分接收器的組合,抗共模干擾能力增強,即抗噪聲干擾性好。
4.傳輸距離遠,支持節(jié)點多, RS485 總線最長可以傳輸 1200m 以上(速率≤100Kbps)一般最大支持 32 個節(jié)點,如果使用特制的 485 芯片,可以達到 128 個或者 256 個節(jié)點,最大的可以支持到 400 個節(jié)點。
注意:
1.485推薦使用在線型,總線型網(wǎng)絡(luò),而不能是星型,環(huán)形網(wǎng)絡(luò)(牽扯到信號反射,造成干擾),2.傳輸距離比較遠的情況下RS485需要2個終端匹配電阻,其阻值要求等于傳輸電纜的特性阻抗120歐姆。(485通訊硬件設(shè)計注意事項比較多,稍有不慎就可能對通信造成很大的干擾,要多查資料)
3.具體使用的時候,使用相應(yīng)的485芯片作為收發(fā)器,比如SP3485,max485等

圖1 SP3485芯片框圖(管腳定義下面介紹)

modbus協(xié)議

去網(wǎng)上搜modbus,關(guān)于該協(xié)議的介紹可能一大推,其實就一句話:modbus定義了一種數(shù)據(jù)幀格式:幀頭---地址---功能碼---數(shù)據(jù)---CRC校驗,注意:協(xié)議是一種很靈活的東西,目的是定義數(shù)據(jù)通訊的格式,上面這個是標準的modbus通訊協(xié)議,具體應(yīng)用的時候可以根據(jù)實際需要進行裁剪,比如加個幀尾,比如換成其他的校驗方式。

所以,大家現(xiàn)在應(yīng)該對485和modbus的關(guān)系有所認識了吧,我們可以把485總線單純地理解為硬件通路,它具有自己的電氣特性,所有的設(shè)備都可以掛在上面,每個設(shè)備有唯一的地址,和串口通信不同的是由于485有專門的控制收發(fā)引腳,所以代碼里面每次發(fā)送前后都要對該控制引腳進行控制。此外軟件上注意延時(電平穩(wěn)定);modbus其實可以理解為硬件公路上的車,它本身就是個軟件協(xié)議,規(guī)定上位機和下位機數(shù)據(jù)以什么樣式進行傳輸。

硬件連接

下面是我用VISIO畫的基本框圖

引腳介紹
RX MCU接收管腳
TX MCU發(fā)送管腳
IO MCU控制485收發(fā)的管腳
RO 屬于485芯片的發(fā)送管腳
DI 屬于485芯片的接收管腳
CTL 是485芯片的控制管腳(實際上是485兩個控制管腳接在一起,當IO輸出低電平,mcu接收數(shù)據(jù),當IO輸出高電平,mcu發(fā)送數(shù)據(jù))

軟件編寫


我們做了一個485批量測試軟件,測試板上放了16個mcu,通過485協(xié)議,PC端讀取每個模組的測試數(shù)據(jù),基本思路如下
1.通過測試板硬件,固定測試板每個模組的地址,然后由mcu去讀各自的Address

#define RS485_TX_EN PAout(8) //485收發(fā)控制.0,接收;1,發(fā)送. uint8_t Address[5]; //由4個IO口讀取電平,拼成一個address uint8_t RS485_address; //存放模組真正地址 void Get_Address() //獲取模組地址 {//D4 PA10//D3 PA0//D2 PA1//D1 PA2 //D0 PA3 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);Address[0] = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3);Address[1] = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2);Address[2] = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1);Address[3] = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);Address[4] = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9); //最開始是25的模組測試板,16個可取消這個IO口RS485_address = ((~Address[4])&0x01)<<4 | Address[3]<<3 | Address[2]<<2 | Address[1]<<1 | Address[0];GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //將PA8配置成收發(fā)控制管腳GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);RS485_TX_EN = 0; //默認為收 }

2.配置串口接收中斷
將模組配置成串口中斷模式,接收PC端發(fā)的指令,然后在中斷中執(zhí)行一些操作,將數(shù)據(jù)上傳到PC
基本協(xié)議如下

PC指令 0x19 0x20 address 0x69 0x19 0x20 address 0x89 注:完整指令一共四個字節(jié)0x19 0x20是幀頭 address是模組的地址,0x69和0x89都是功能碼對應(yīng)不同的操作

3.串口中斷函數(shù)

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]) //對應(yīng)當功能碼為0x69時執(zhí)行的操作{/***************其余操作*********************************/RS485_TX_EN = 1; //給485控制管腳高電平,發(fā)送數(shù)據(jù)delay_ms(1); //延時1ms等485切換控制管腳的電平穩(wěn)定/***************發(fā)送操作*******************/delay_ms(1); //延時1ms等485切換控制管腳的電平穩(wěn)定RS485_TX_EN = 0;gRxbuf[0] = 0; //處理完畢將存儲指令的數(shù)組清空復(fù)位 gRxbuf[1] = 0;gRxbuf[2] = 0;gRxbuf[3] = 0;} if(0x89 == gRxbuf[3]) //對應(yīng)當功能碼為0x89時執(zhí)行的操作{/***************其余操作*********************************/RS485_TX_EN = 1;delay_ms(1);/***************發(fā)送操作*******************/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向總線發(fā)了一個測試指令0x19 0x20 0x00 0x69,485總線上的所有設(shè)備都可以收到這四個字節(jié),然后通過軟件編寫,485設(shè)備會將接收到的指令的地址碼即0x00和它們自己的地址做比較,當一樣時知道是發(fā)給自己的,當不一樣時不做任何回應(yīng),從而實現(xiàn)訪問485總線的多點通信。

總結(jié)

以上是生活随笔為你收集整理的RS485通讯介绍(附批量测试思路)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。