細說STM32F407單片機RS485收發通信實例及調試方法

目錄

一、硬件配置

1、RCC、DEBUG、CodeGenerator

2、USART3

3、 RS485_DIR

4、NVIC?

二、軟件設計

1、RS485的收發控制

2、main.c

三、運行調試

1、修改RS485_DIR為SET后需要延遲

2、向串口助手發送的數據不能太長


????????MCU上的串口UART(USART)是邏輯電平(TTL或CMOS電平),在開發板上實現與串口助手之間的RS485通信,就是把單片機上的邏輯電平通過RS485物理層芯片轉換為RS485電平。

? ? ? ? 本文繼續使用旺寶紅龍開發板STM32F407ZGT6 KIT V1.0。本文的目的是通過MAX485物理層芯片把開發板上的USART3(PB10、PB11)邏輯電平轉換為RS485電平,然后通過一條USB轉RS485的轉換線連接到串口助手上。原理圖如下:

? ? ? ? P18的管腳A+連接USB轉RS485的線的T/R+,P18的管腳A-連接USB轉RS485的線的T/R-。

????????在串口助手上識別出識別出該線的驅動,選擇并設置波特率,通過幾次調試可以選擇到不失真時的最大波特率,其它參數可以默認。串口助手的波特率與MCU里配置USART3時選擇的波特率要一致。

一、硬件配置

1、RCC、DEBUG、CodeGenerator

  • RCC:外部晶振25MHz,HCLK=168MHz,PCLK1=42MHz,PCLK2=84MHz;
  • DEBUG:Serial Wire;
  • CodeGenerator:勾選?Generate peripheral initialization as a pair of '.c/.h' files per peripheral

2、USART3

????????配置PB10、PB11為USART3,波特率9600,其它參數默認;

? ? ? ? 本文作者測試到波特率14400,不失真,15200失真。

3、 RS485_DIR

? ? ? ? RS485是半雙工通信的,因此有方向控制,設置PF7為RS485_DIR,默認為高電平。

4、NVIC?

? ? ? ? 把Times base的中斷優先級修改為0。USART3的全局中斷可以設置為優先級1。如果不需要也可以不選擇。

二、軟件設計

? ? ? ? 實例程序很短,只是為了演示RS485的收發控制。

1、RS485的收發控制

? ? ? ? ?每次向串口助手發送前,要先把RS485_DIR置位。

  //修改RS485為發送HAL_GPIO_WritePin(RS485_DIR_GPIO_Port, RS485_DIR_Pin, GPIO_PIN_SET);

????????每次接收數據前要先把RS485_DIR復位。

//默認RS485為接收狀態
HAL_GPIO_WritePin(RS485_DIR_GPIO_Port, RS485_DIR_Pin, GPIO_PIN_RESET);

2、main.c

/* USER CODE BEGIN Includes */
#include <stdio.h>
uint8_t rxbuf[8];
uint8_t ackbuf[]="123\r\n";
/* USER CODE END Includes */
/* USER CODE BEGIN 2 *///默認RS485為發送狀態uint8_t txbuf1[]="Hello,world!\r\n";HAL_UART_Transmit(&huart3,txbuf1,sizeof(txbuf1),1000);HAL_Delay(500);HAL_UART_Transmit(&huart3,txbuf1,sizeof(txbuf1),1000);HAL_Delay(500);uint8_t txbuf2[]="TEST RS485!\r\n";HAL_UART_Transmit(&huart3,txbuf2,sizeof(txbuf2),1000);HAL_Delay(500);HAL_UART_Transmit(&huart3,ackbuf,sizeof(ackbuf),1000);HAL_Delay(500);//修改RS485為接收HAL_GPIO_WritePin(RS485_DIR_GPIO_Port, RS485_DIR_Pin, GPIO_PIN_RESET);//485改為接收后,不能發送HAL_UART_Transmit(&huart3,ackbuf,sizeof(ackbuf),1000);HAL_Delay(500);//修改RS485為發送HAL_GPIO_WritePin(RS485_DIR_GPIO_Port, RS485_DIR_Pin, GPIO_PIN_SET);//沒有適當的延遲,則亂碼HAL_Delay(200);	//切換測試,注釋掉,以觀察亂碼uint8_t txbuf3[]="can transmit again.\r\n";HAL_UART_Transmit(&huart3,txbuf3,sizeof(txbuf3),1000);HAL_Delay(500);HAL_UART_Transmit(&huart3,ackbuf,sizeof(ackbuf),1000);HAL_Delay(500);HAL_UART_Transmit(&huart3,txbuf1,sizeof(txbuf1),1000);HAL_Delay(500);//修改為小于16字節后,亂碼消失.uint8_t txbuf4[]="transmit again.\r\n";HAL_UART_Transmit(&huart3,txbuf4,sizeof(txbuf4),1000);HAL_Delay(500);/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
while (1)
{/* USER CODE END WHILE *//* USER CODE BEGIN 3 *//* 如果MCU接收到數據,則執行發送任務,發送前修改485為發送*/if(HAL_UART_Receive(&huart3,rxbuf,sizeof(rxbuf),1000) == HAL_OK){/*設置485為發送*/HAL_GPIO_WritePin(RS485_DIR_GPIO_Port, RS485_DIR_Pin, GPIO_PIN_SET);//修改RS485收發控制后要有延遲,否則,立刻發送的數據會有亂碼HAL_UART_Transmit(&huart3,ackbuf,sizeof(ackbuf),1000);printf("\r\n");HAL_Delay(200);printf("修改RS485_DIR后要有延遲,");printf("否則,立刻發送的數據會有亂碼.\r\n");HAL_Delay(500);	//這是必需,否則會亂碼HAL_UART_Transmit(&huart3,ackbuf,sizeof(ackbuf),1000);HAL_Delay(500);char str[8];sprintf(str,"%s",ackbuf);printf("test:%s\r\n",str);HAL_Delay(500);uint8_t txbuf6[]="RS485發送的數據:";HAL_UART_Transmit(&huart3,txbuf6,sizeof(txbuf6),1000);//printf("RS485發送的數據:");HAL_Delay(500);HAL_UART_Transmit(&huart3,rxbuf,sizeof(rxbuf),1000);HAL_Delay(500);printf("\r\n");HAL_Delay(200);uint8_t txbuf7[]="\r\n";HAL_UART_Transmit(&huart3,txbuf7,sizeof(txbuf7),1000);HAL_Delay(200);}/默認RS485為接收狀態HAL_GPIO_WritePin(RS485_DIR_GPIO_Port, RS485_DIR_Pin, GPIO_PIN_RESET);
}
/* USER CODE END 3 */
/* USER CODE BEGIN 4 */
//串口打印
int __io_putchar(int ch)
{HAL_UART_Transmit(&huart3,(uint8_t*)&ch,1,0xFFFF);return ch;
}
/* USER CODE END 4 */

三、運行調試

? ? ? ? 重要的調試發現,在調試RS485通訊時,發現串口助手上顯示亂碼,最終找到2個原因:

1、修改RS485_DIR為SET后需要延遲

? ? ? ? 每次HAL_GPIO_WritePin(RS485_DIR_GPIO_Port, RS485_DIR_Pin, GPIO_PIN_SET)后應該適當地延遲,不然,顯示到串口助手上的數據亂碼。

2、向串口助手發送的數據不能太長

? ? ? ? 向串口助手上發送的數據不能太長,不然,也會亂碼。具體達到多長的數據才開始亂碼,要測試后確定。過長的數據可以分批次傳送,printf()函數更適合發送長的數據,也適合發送和顯示有換行要求的數據;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896679.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896679.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896679.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PDF工具 Candy Desktop(安卓)

PDF Candy Desktop&#xff08;安卓&#xff09; 今天給大家分享一個電腦端的PDF工具&#xff0c;里面的功能很多&#xff0c;主要涉及PDF編輯、轉換等&#xff0c;不僅超級好用&#xff0c;而且免費&#xff01;剩下就不說了&#xff0c;兄弟們自行下載體驗吧&#xff01; 「…

基于javaweb的SSM+Maven幼兒園管理系統設計和實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論…

golang安裝(1.23.6)

1&#xff0e;切換到安裝目錄 cd /usr/local 2&#xff0e;下載安裝包 wget https://go.dev/dl/go1.23.6.linux-amd64.tar.gz 3&#xff0e;解壓安裝包 sudo tar -C /usr/local -xzf go1.23.6.linux-amd64.tar.gz 4&#xff0e;配置環境變量 vi /etc/profile export PATH$…

【新手入門】SQL注入之盲注

一、引言 在我們的注入語句被帶入數據庫查詢但卻什么都沒有返回的情況我們該怎么辦? 例如應用程序返回到一個"通用的"的頁面&#xff0c;或者重定向一個通用頁面(可能為網站首頁)。這時&#xff0c;我們之前學習的SQL注入的辦法就無法使用了。這種情況我們稱之為無…

2024年12月中國電子學會青少年軟件編程(Python)等級考試試卷(六級)答案 + 解析

青少年軟件編程(Python)等級考試試卷(六級) ↓↓↓↓↓↓ 真題模擬測試 分數:100 題數:38 一、單選題(共25題,共50分) 下面代碼的輸出結果正確的是?( )import json json_str =’ [ “Alice”, “girl", 17,“New York”]’ data = json.loads(json_str) prin…

wordpress按不同頁調用不同的標題3種形式

在WordPress中&#xff0c;可以通過多種方式根據不同的頁面調用不同的標題。這通常用于實現SEO優化、自定義頁面標題或根據頁面類型顯示不同的標題內容。 使用wp_title函數 wp_title函數用于在HTML的title標簽中輸出頁面標題。你可以通過修改主題的header.php文件來實現自定義…

DeepSeek-R1 大模型實戰:騰訊云 HAI 平臺 3 分鐘極速部署指南

引言&#xff1a;為什么選擇 DeepSeek-R1&#xff1f; 近期&#xff0c;國產大模型 DeepSeek-R1 因其低成本、高性能的特點在全球 AI 領域引發熱議。根據 Sensor Tower 數據&#xff0c;其發布僅 18 天便斬獲 1600 萬次下載量&#xff0c;遠超 ChatGPT 同期表現。而騰訊云推出…

【Pytest】setup和teardown的四個級別

文章目錄 1.setup和teardown簡介2.模塊級別的 setup 和 teardown3.函數級別的 setup 和 teardown4.方法級別的 setup 和 teardown5.類級別的 setup 和 teardown 1.setup和teardown簡介 在 pytest 中&#xff0c;setup 和 teardown 用于在測試用例執行前后執行一些準備和清理操…

使用Docker將ros1自定義消息通過rosjava_bootstrap生成jar包

文章目錄 預準備環境rosjava_bootstrap壞消息好消息 環境安裝docker安裝rosjava_bootstrap倉庫rosjava_center倉庫修改rosjava_bootstrap代碼拉取docker鏡像放置自己的自定義消息 啟動docker編譯 預準備環境 rosjava_bootstrap rosjava_bootstrap是將自定義的ROS消息生成java…

《Python實戰進階》No 7: 一個AI大模型聊天室的構建-基于WebSocket 實時通信開發實戰

第7集&#xff1a; 一個AI大模型聊天室的構建-基于WebSocket 實時通信開發實戰 在現代 Web 開發中&#xff0c;實時通信已經成為許多應用的核心需求。無論是聊天應用、股票行情推送&#xff0c;還是多人協作工具&#xff0c;WebSocket 都是實現高效實時通信的最佳選擇之一。本…

輪式機器人在復雜地形中如何選擇合適的全局路徑規劃算法?

已思考完成 收起 嗯&#xff0c;用戶問的是輪式機器人在復雜地形中如何選擇合適的全局路徑規劃算法。首先&#xff0c;我需要理解復雜地形可能帶來的挑戰&#xff0c;比如崎嶇的路面、動態障礙物、非結構化環境等等。輪式機器人在這里的運動控制需要考慮地形通過性、穩定性&…

Mysql100道高頻面試題

一、基礎概念 1. 什么是數據庫&#xff1f;DBMS的作用是什么&#xff1f; 數據庫&#xff1a;是按照數據結構來組織、存儲和管理數據的倉庫。它允許用戶高效地訪問和管理數據。 DBMS&#xff08;數據庫管理系統&#xff09;&#xff1a;是一種軟件系統&#xff0c;用于創建和…

React底層原理詳解

React中Element&Fiber對象、WorkInProgress雙緩存、Reconcile&Render&Commit、第一次掛載過程詳解 在面試中介紹React底層原理時&#xff0c;需遵循邏輯清晰、層次分明、重點突出的原則&#xff0c;結合技術深度與實際應用場景。以下是結構化回答模板&#xff1a;…

qt5的中文亂碼問題,QString、QStringLiteral 為 UTF-16 編碼

qt5的中文亂碼問題一直沒有很明確的處理方案。 今天處理進程間通信時&#xff0c;也遇到了qt5亂碼問題&#xff0c;一邊是設置的GBK&#xff0c;一邊設置的是UTF8&#xff0c;單向通信約定采用UTF8。 發送端保證發的是UTF8字符串&#xff0c;因為UTF8在網絡數據包中沒有字節序…

解鎖瀏覽器內置API,助力跨標簽/跨頁面數據通信

1 BrodcastChanner 概念 BroadcastChannel接口表示給定源的任何瀏覽上下文都可以訂閱的命名頻道。它允許同源的不同瀏覽器窗口、標簽頁、frame 或者 iframe 下的不同文檔之間相互通信。消息通過message事件進行廣播&#xff0c;該事件在偵聽該頻道的所有BroadcastChannel對象上…

Mysql-如何理解事務?

一、事務是什么東西 有些場景中&#xff0c;某個操作需要多個sql配合完成&#xff1a; 例如&#xff1a; 李四這個月剩下的前不夠交房租了&#xff0c;找張三借1000元急用&#xff1a; &#xff08;1&#xff09;給張三的賬戶余額 減去1000元 updata 賬戶表 set money money -…

《deepseek FlashMLA :高效的 MLA 解碼內核》:此文為AI自動翻譯

FlashMLA GitHub - deepseek-ai/FlashMLA FlashMLA 是適用于 Hopper GPU 的高效 MLA 解碼內核&#xff0c;針對可變長度序列服務進行了優化。 當前發布&#xff1a; BF16、FP16塊大小為 64 的分頁 kvcache 快速開始 安裝 python setup.py install 基準 python tests/test_fl…

Windows對比MacOS

Windows對比MacOS 文章目錄 Windows對比MacOS1-環境變量1-Windows添加環境變量示例步驟 1&#xff1a;打開環境變量設置窗口步驟 2&#xff1a;添加系統環境變量 2-Mac 系統添加環境變量示例步驟 1&#xff1a;打開終端步驟 2&#xff1a;編輯環境變量配置文件步驟 3&#xff1…

藍橋杯 之 填空題-位運算與循環

文章目錄 循環握手問題門牌制作-循環小球反彈幸運數藝術與籃球跑步 位運算3個1美麗的2024 位運算 可以關注這個Lowbit(x) 如何判斷最低位是否是1&#xff1f; num&1 1就說明num最低位是1 循環 循環 握手問題 握手問題 思路分析&#xff1a; 可以直接計算出來&#xff…

Java進階——反射機制超全詳解

反射能在運行時動態操作類和對象的能力&#xff0c;極大地增強了程序的靈活性。但是反射的使用也伴隨著性能開銷和安全風險。本文將由博主帶你一起深入探討 Java 反射的核心概念、關鍵類和方法&#xff0c;以及在日常開發中的應用場景。 本文目錄 一、反射的核心概念1. 運行時類…