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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

485通讯实验

發布時間:2023/12/9 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 485通讯实验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

更多交流歡迎關注作者抖音號:81849645041

目的

????????了解STM32F4 RS485,RS422通訊原理,掌握RS485,RS422通訊協議實現設備間通訊。

原理

????????與 CAN 類似,RS-485 是一種工業控制環境中常用的通訊協議,它具有抗干擾能力強、 傳輸距離遠的特點。RS-485 通訊協議由 RS-232 協議改進而來,協議層不變,只是改進了 物理層,因而保留了串口通訊協議應用簡單的特點。

RS-485 的物理層

????????差分信號線具有很強的干擾能力,特別適合應用于電磁環境復雜的工業控制環境中,RS-485 協議主要是把 RS-232 的信號改進成差分信號,從而大大提高了抗干擾特性,它的通訊網絡示意圖見圖:

????????每個節點都是由一個通訊控制器和一個收發器組成,在 RS-485 通訊網絡中,節點中的串口控制器使用 RX 與 TX信號線連接到收發器上,而收發器通過差分線連接到網絡總線,串口控制器與收發器之間一般使用 TTL 信號傳輸,收發器與總線則使用差分信號來傳輸。發送數據時,串口控制器的 TX 信號經過收發器轉換成差分信號傳輸到總線上,而接收數據時,收發器把總線上的差分信號轉化成 TTL 信號通過 RX 引腳傳輸到串口控制器中。

????????RS-485 通訊網絡的最大傳輸距離可達 1200 米,總線上可掛載 128 個通訊節點,而由 于 RS-485 網絡只有一對差分信號線,它使用差分信號來表達邏輯,當 AB 兩線間的電壓差 為-6V~-2V 時表示邏輯 0,當電壓差為+2V~+6V 表示邏輯 1,在同一時刻只能表達一個信 號,所以它的通訊是半雙工形式的。

????????485(一般稱作 RS485/EIA-485)是隸屬于 OSI 模型物理層的電氣特性規定為 2 線,半雙工,多點通信的標準。它的電氣特性和 RS-232 大不一樣。用纜線兩端的電壓差值來表示傳遞信號。RS485 僅僅規定了接受端和發送端的電氣特性。它沒有規定或推薦任何數據協議。

????????RS485 的特點包括:

????????① 接口電平低,不易損壞芯片。RS485 的電氣特性:邏輯“1”以兩線間的電壓差為+(2~6)V表示;邏輯“0”以兩線間的電壓差為-(2~6)V 表示。接口信號電平比 RS232 降低了,不易損壞接口電路的芯片,且該電平與 TTL 電平兼容,可方便與 TTL 電路連接。

????????② 傳輸速率高。10 米時,RS485 的數據最高傳輸速率可達 35Mbps,在 1200m 時,傳輸速度可達 100Kbps。

????????③ 抗干擾能力強。RS485 接口是采用平衡驅動器和差分接收器的組合,抗共模干擾能力 增強,即抗噪聲干擾性好。傳輸距離遠,支持節點多。RS485 總線最長可以傳輸 1200m以上(速率≤100Kbps)

????????④ 一般最大支持 32 個節點,如果使用特制的 485 芯片,可以達到 128 個或者 256 個節點,最大的可以支持到 400 個節點。

????????RS485 推薦使用在點對點網絡中,線型,總線型,不能是星型,環型網絡。理想情況下 RS485需要 2 個終端匹配電阻,其阻值要求等于傳輸電纜的特性阻抗(一般為 120Ω)。沒有特性阻抗的話,當所有的設備都靜止或者沒有能量的時候就會產生噪聲,而且線移需要雙端的電壓差。沒有終接電阻的話,會使得較快速的發送端產生多個數據信號的邊緣,導致數據傳輸出錯。

????????在上面的連接中,如果需要添加匹配電阻,我們一般在總線的起止端加入,也就是主機和設備 4 上面各加一個 120Ω的匹配電阻。

????????由于 RS485 具有傳輸距離遠、傳輸速度快、支持節點多和抗干擾能力更強等特點,所以 RS485 有很廣泛的應用。

????????我們的STM32F407開發板使用的是RS422,使用MAX3490作為接受器。下面介紹RS422特性。

RS422概述

????????RS-422標準全稱是“平衡電壓數字接口電路的電氣特性”,它定義了接口電路的特性。實際上還有一根信號地線,共5根線。由于接收器采用高輸入阻抗和發送驅動器比RS232更強的驅動能力,故允許在相同傳輸線上連接多個接收節點,最多可接10個節點。一個主設備(Master),其余為從設備(Slave),從設備之間不能通信,所以RS-422支持點對多的雙向通信。接收器輸入阻抗為4k,故發端最大負載能力是10*4k+100Ω(終接電阻)。

????????RS-422和RS-485電路原理基本相同,都是以差動方式發送和接受,不需要數字地線。差動工作是同速率條件下傳輸距離遠的根本原因,這正是二者與RS232的根本區別,因為RS232是單端輸入輸出,雙工工作時至少需要數字地線。發送線和接受線三條線(異步傳輸),還可以加其它控制線完成同步等功能。

????????RS-422通過兩對雙絞線可以全雙工工作收發互不影響,而RS485只能半雙工工作,發收不能同時進行,但它只需要一對雙絞線。RS422和RS485在19kpbs下能傳輸1200米。用新型收發器線路上可連接多臺設備。

????????RS-422的電氣性能與RS-485完全一樣。主要的區別在于:RS-422有4根信號線:兩根發送(Y、Z)、兩根接收(A、B)。由于RS-422的收與發是分開的所以可以同時收和發(全雙工);RS-485有2根信號線:發送和接收。

????????開發板采用的是MAX3490作為接收器,引腳圖:

?RS422引腳配置和典型工作電路:

?準備

????????MDK5 開發環境。

????????STM32F4xx HAL庫。

????????STM32F407 開發板。

????????STM32F4xx 參考手冊。

????????STM32F4xx 數據手冊。

????????STM32F407 開發板電路原理圖。

步驟

  • 查看STM32F407電路原理圖,找到RS422接線引腳。

????????對照開發板,可以看到RS422輸入輸出引腳和串口2共用引腳,連接的是PA2和PA3。所以需要對PA2,PA3引腳復用。開發板上也需要跳線帽連接RS422和串口2。

最后,通過導線或雙絞線把兩個開發板A,B,Z,Y連接起來。對應的A連接Y,B連接Z,Z連接B,Y連接A,可以參考上面工作電路連接圖。連接錯誤會導致通訊異常。

  • 新建兩個文件bsp_rs422.h和bsp_rs422.c,在bsp_rs422.h定義宏和函數。
#ifndef __BSP_RS422_H #define __BSP_RS422_H#include "stm32f4xx.h"#define EN_USART2_RX 1 //接收中斷使能void RS422_Init(uint32_t bound); // RS422初始化 void RS422_Send_Data(uint8_t *buf, uint8_t len); // 發送數據 void RS422_Receive_Data(uint8_t *buf, uint8_t *len); // 接收數據#endif

  • 在bsp_rs422.c中實現串口2初始化,接收數據和發送數據函數。

????????第一步:RS422_Init(u32 bound)初始化函數中,復用PA2和PA3引腳,初始化串口2,RS422和USART2共用,調用的也是串口初始化函數。開啟接收中斷。

????????第二步:RS422_Send_Data(u8 *buf,u8 len)數據發送函數,調用HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)發送指定長度數據;

????????第三步:USART2_IRQHandler(void) 中斷函數中,判斷接收狀態,調用HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)接收一個字節放到數組中;

????????第四步:RS422_Receive_Data(u8 *buf,u8 *len)接收函數中,判斷數據是否接收完,返回數據和長度。

#include "bsp_rs422.h"UART_HandleTypeDef RS422_huart; // USART2 句柄(用于 RS422)#if EN_USART2_RX // 如果使能了接收uint8_t RS422_RX_BUF[64]; // 接收緩存區 接收緩沖,最大 64 個字節. uint8_t rxCount=0; // 接收到的數據長度/** * 函數名:USART2_IRQHandler * 描述:接收中斷 連續接收一個字節 直到接收完 * 輸入:無 * 輸出:無 */ void USART2_IRQHandler(void) // 接收中斷 連續接收一個字節 直到接收完 {uint8_t rec;if(__HAL_UART_GET_FLAG(&RS422_huart, UART_FLAG_RXNE) != RESET) // 接收中斷{HAL_UART_Receive(&RS422_huart, &rec, 1, 1000);if(rxCount < 64){RS422_RX_BUF[rxCount] = rec; // 記錄接收到的值rxCount++; // 接收數據增加 1}} }#endif /** * 函數名:RS422_Init * 描述:初始化 * 輸入:bound 波特率 * 輸出:無 */ void RS422_Init(uint32_t bound) // 初始化 {GPIO_InitTypeDef GPIO_Init;__HAL_RCC_GPIOA_CLK_ENABLE(); // 使能 GPIOA 時鐘__HAL_RCC_USART2_CLK_ENABLE(); // 使能 USART2 時鐘GPIO_Init.Pin = GPIO_PIN_2 | GPIO_PIN_3;GPIO_Init.Mode = GPIO_MODE_AF_PP;GPIO_Init.Speed = GPIO_SPEED_FREQ_HIGH;GPIO_Init.Pull = GPIO_PULLUP;GPIO_Init.Alternate = GPIO_AF7_USART2; // 復用為 USART2HAL_GPIO_Init(GPIOA, &GPIO_Init);RS422_huart.Instance = USART2; // USART2RS422_huart.Init.BaudRate = bound; // 波特率RS422_huart.Init.Mode = UART_MODE_TX_RX; // 收發模式RS422_huart.Init.WordLength = UART_WORDLENGTH_8B; // 字長 8 位數據RS422_huart.Init.StopBits = UART_STOPBITS_1; // 一個停止位RS422_huart.Init.Parity = UART_PARITY_NONE; // 無奇偶校驗位RS422_huart.Init.HwFlowCtl = UART_HWCONTROL_NONE; // 無硬件流控HAL_UART_Init(&RS422_huart);//__HAL_UART_DISABLE_IT(&RS422_huart, UART_IT_TC); // 失能#if EN_USART2_RX__HAL_UART_ENABLE_IT(&RS422_huart, UART_IT_RXNE); // 開啟接收中斷HAL_NVIC_EnableIRQ(USART2_IRQn); // 使能 USART1 中斷HAL_NVIC_SetPriority(USART2_IRQn, 3, 3); // 搶占優先級 3,子優先級 3 #endif }/** * 函數名:RS422_Send_Data * 描述:發送 len 個字節 * 輸入:buf:發送區首地址 len:發送的字節數(為了和本代碼的接收匹配,這里建議不要超過 64 個字節) * 輸出:無 */ void RS422_Send_Data(uint8_t *buf, uint8_t len) {HAL_UART_Transmit(&RS422_huart, buf, len, 10000); }/** * 函數名:RS422_Receive_Data * 描述:RS422 查詢接收到的數據 * 輸入:buf:接收緩存首地址 len:讀到的數據長度 * 輸出: */ void RS422_Receive_Data(uint8_t *buf, uint8_t *len) {*len = 0; // 默認為 0HAL_Delay(10); // 等待 10ms,連續超過 10ms 沒有接收到一個數據,則認為接收結束if(rxCount){ // 接收到了數據,且接收完成了for(uint8_t i = 0; i < rxCount; i++){buf[i] = RS422_RX_BUF[i];}*len = rxCount; // 記錄本次數據長度rxCount = 0; // 清零} }
  • main.c中程序如下:

????????第一步:定義5元素數組作為發送的數據。

????????第二步:初始化系統時鐘,串口打印,按鍵,LED,RS422。

????????第三步:KEY1按下就發送數據。循環接收數據,有數據就打印接收的數據。

#include "bsp_clock.h" #include "bsp_uart.h" #include "bsp_key.h" #include "bsp_rs422.h" #include "bsp_led.h"int main(void) {uint8_t Txbuf[5] = {1,2,3,4,5}; // 發送的數據uint8_t Rxbuf[5]; // 接收數組uint8_t i,len;CLOCLK_Init(); // 初始化系統時鐘UART_Init(); // 串口初始化KEY_Init(); // 按鍵初始化LED_Init(); // LED初始化RS422_Init(115200); // RS422初始化while(1){if(KEY_Scan(0) == 1) // KEY1按下{ LED1_Toggle; // 點亮LED1printf("Sand data ");for(i = 0; i < 5; i++){ printf("%d ", Txbuf[i]); // 打印發送的數據}RS422_Send_Data(Txbuf, 5); // 調用發送函數發送數據}RS422_Receive_Data(Rxbuf, &len); // 循環接收數據 得到數據和長度if(len) // 長度不為0{ LED2_Toggle; // 點亮LED2printf("Recv data ");for(i = 0; i < len; i++) // 打印接收的數據{ printf("%d ", Rxbuf[i]);}}HAL_Delay(50);} }

現象

????????將程序下載到兩個開發板中,保證端口A,B,Z,Y連接正確。A連接Y,B連接Z,Z連接B,Y連接A。按下開發板1的KEY1發送數據,打印發送的數據,點亮LED1。按下開發板2的KEY1發送數據,開發板1接收到數據,打印接收的數據并點亮LED2。

????????按下板1 KEY1,板2接收到數據LED2會點亮。

?????????按下板2的KEY1,板1接收到數據打印并點亮LED2。

總結

以上是生活随笔為你收集整理的485通讯实验的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。