STM32 F103C8T6學習筆記7:雙機無線串口通信

今日嘗試配通倆個C8T6單片機之間的無線串口通信,文章提供原理,源碼,測試效果圖,測試工程下載:

目錄

傳輸不規范問題:

串口通信資源:

單個串口資源理解:

單片機串口資源:

測試目標與測試硬件連接:

串口初始化與串口中斷接收邏輯:

串口初始化:

初步測試能否收發:

?階段測試效果:

規范接收:

幾個串口配置方面的注意點:

測試接收:


今日學習加強 :倆片單片機之間的串口通信

單片機的串口通信要想配置好發送與接收,都很簡單,如果沒有任何意外,我們甚至不需要定義過于規范的 幀頭、幀尾 就能實現最簡單的倆個單片機的通信;

傳輸不規范問題:

但在實際的數據傳輸的過程中,難免會出現:

1.某次傳輸不小心丟失數據,該次傳輸所得需作廢。

2.發送 或者 接收 了一次偶爾的錯誤幀。

3.發送方開機比較快,接收方的第一個數據是從中間開始接收的。

............

以上這些不對勁的接收情況的數據是需要直接剔除的,直到接收到正確的數據。

本文會使用一個額外的無線通信模塊,大家可從下文了解其配置,如果有自己的無線串口模塊,一樣配置好接上使用即可,沒有無線串口模塊,可以勉強使用杜邦線代替,但用杜邦線就模擬不了誤傳情況了~

DL_20無線串口模塊_NULL指向我的博客-CSDN博客

串口通信資源:

單個串口資源理解:

引腳方面,STM32每一個串口都有至多五個引腳:(有的串口只有TX RX )

1.TX 和 RX? 發送與接收

2.SCLK??????? 時鐘

3.nRTS ?????? 請求發送

4.nCTS??????? 允許發送

?其中最常用的、必不可少的就是TX與RX了,SCLK是同步時鐘,是同步通信時用到的,而我們此次的無線通信屬于異步通信,因此用不到,3、4是硬件流控制的引腳,我們也用不到。

單片機串口資源:

這是我之前文章總結的串口資源: STM32 F103 C8T6共有三個串口:

?這里其余沒有特別需要注意的地方,但在初始化時USART1與2、3有區別,我們除了更改引腳之外,同時需要注意:

USART1是掛載在APB2總線上的外設接口(更快),而其余倆個串口都是掛載在APB1總線上的,因此在初始化開啟端口時鐘時此處需要額外注意。

?

測試目標與測試硬件連接:

測試目標:

1.實現倆片單片機的無線通信

2.單片機1的串口1 接無線通信模塊,并不斷發送數據

3.單片機2的串口1接無線通信模塊,接收單片機1的數據,串口2接串口轉USB模塊,將接受到的數據回傳到上位機電腦(注意有沒有安裝CH340等類似驅動)

?

串口初始化與串口中斷接收邏輯:

串口初始化:

這部分不用細講,本文主要是寫串口接收方邏輯,串口初始化配置方面,不清楚的可以看這篇文章:

STM32 F103C8T6學習筆記3:串口配置—串口收發—自定義Printf函數_NULL指向我的博客-CSDN博客

?

初步測試能否收發:

?單片機1的程序帶有一個定時器每秒使用串口1發送12345的程序,串口1是連接了無線模塊的,因此同樣在串口1連接了無線模塊的單片機2會在串口1中斷接收到這個數據,而我們先不寫任何判斷,接收到就返還數據看看~進行初步的測試,這個過程的測試程序,沒法存下任何有用的數據,只是簡單的返還而已:

單片機1 定時器每秒進中斷,使用串口1發送一次12345:

?單片機2 串口1中斷接收到數據 直接通過串口2鏈接了串口轉USB模塊外傳給上位機:

?階段測試效果:

下載程序到倆個單片機,查看階段測試效果:

測試結果中:看似一給單片機1通電了,單片機2就能收到信息反饋給上位機,分毫不差,但這個過程單片機2其實并未將數據保存下來,也就是它并不知道自己接受到的是怎么回事,只是無腦地轉發消息罷了

規范接收:

幾個串口配置方面的注意點:

1.倆片單片機收發的時間點要岔開,嚴格杜絕一個程序都寫了收和發,卻下載給倆個單片機,這樣容易會使得倆個單片機變成“永動機”,卡在那,建議剛開始就單個只管發送,關閉接收中斷,另一個只管接收

2.注意其他中斷源(尤其是定時器中斷),即使是1s進一次定時器中斷,也可能會對接收方的串口中斷、主程序CPU處理過程 造成毀滅性的打斷(時機不湊巧),因此在進入主程序處理接收操作時,應該要想辦法關閉其余中斷,處理完畢再打開其余中斷

3.注意標志位的正確時機勿忘記清除:中斷標志位,數據接收完成標志位,數組緩存下標,甚至是緩存數組也要在處理完后及時清零。

4.其余配置有中斷的外設,如果在系統運行時有進入中斷的時機,(尤其是定時器溢出中斷,這個必定會進)一定要給其配好中斷服務函數,并且中斷服務函數要寫好清除標志位等退出中斷的操作,否則程序容易在中斷服務函數那卡住。

這樣接收,就能將數據存在數組進行下一步處理了:

#include "USART1.h"char usart_buf[25];
char usart_flag=0;
char usart_xb=0;void USART1_IRQHandler(void)
{//接收中斷if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){//清除標志:USART_ClearFlag(USART1, USART_FLAG_RXNE);//數組承接數據usart_buf[usart_xb]=USART_ReceiveData(USART1);//如果接收到數據結尾:if(usart_buf[usart_xb]=='\n' && usart_buf[usart_xb-1]== '\r') {usart_flag=1;}//下標最大不超25if(usart_xb==25) {usart_xb=0;memset(usart_buf,0,sizeof(usart_buf));}//下標移動usart_xb++;}}//確保你已經包含了相應的頭文件,例如`#include <stm32f10x.h>`。
//		__enable_irq();  // 開啟總中斷
//    __disable_irq(); // 關閉總中斷
//		__disable_irq(); // 屏蔽中斷
//    __enable_irq(); // 恢復中斷void handle_uart1(void)
{if(usart_flag==1){__disable_irq(); // 屏蔽中斷UsartPrintf (USART2,"\r\n");UsartPrintf (USART2,"%s",usart_buf);		usart_xb=0;memset(usart_buf,0,sizeof(usart_buf));  //處理完命令別忘了將數組清零,以便接收下個命令usart_flag=0;__enable_irq(); // 恢復中斷}
}

測試接收:

接收情況正常:

?測試工程下載:

https://download.csdn.net/download/qq_64257614/88212346?spm=1001.2014.3001.5503

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

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

相關文章

Redis的單線程與多線程

Redis的核心處理邏輯一直都是單線程 有一些分支模塊是多線程(某些異步流程從4.0開始用的多線程&#xff0c;例如UNLINK、FLUSHALL ASYNC、FLUSHDB ASYNC等非阻塞的刪除操作。網絡I/O解包從6.0開始用的是多線程;) 為什么是單線程 多線程多好啊可以利用多核優勢 官方給的解釋 …

UI自動化環境的搭建(python+pycharm+selenium+chrome)

最近在做一些UI自動化的項目&#xff0c;為此從環境搭建來從0到1&#xff0c;希望能夠幫助到你&#xff0c;同時也是自我的梳理。將按照如下進行開展&#xff1a; 1、python的下載、安裝&#xff0c;python環境變量的配置。 2、pycharm開發工具的下載安裝。 3、selenium的安裝。…

Leetcode34 在排序數組中查找元素的第一個和最后一個位置

給你一個按照非遞減順序排列的整數數組 nums&#xff0c;和一個目標值 target。請你找出給定目標值在數組中的開始位置和結束位置。 如果數組中不存在目標值 target&#xff0c;返回 [-1, -1]。 你必須設計并實現時間復雜度為 O(log n) 的算法解決此問題。 代碼&#xff1a; c…

如何使用 Go 獲取 URL 的參數,以及使用時的問題

Go 獲取 URL 參數也很容易&#xff0c;但是由于 Go 有嚴格的數據類型和錯誤管理&#xff0c;所以在使用時會些微有些復雜。所以本文不僅會講如何獲取 URL 的參數&#xff0c;也會講在使用時的一些問題。 首先假設 URL 是https://www.example.com/?keywordabc&id12。 其他…

java中函數式接口、Stream流、方法引用、junit單元測試、反射、注解

函數式接口&#xff1a; 在java中有且僅有一個抽象方法的接口稱為函數式接口&#xff0c;但是可以包含其它的默認的或靜態的方法。 格式&#xff1a; 修飾符 interface 接口名稱 {public abstract 返回值類型 方法名稱(可選參數);// 其他非抽象方法 }函數式接口&#xff1a;…

服務器安全維護注意事項有哪些?

服務器的安全關系著公司整個網絡以及所有數據的安全&#xff0c;我們該如何做好服務器后續的安全維護呢?河南億恩科技股份有限公司&#xff0c;專注服務器托管23年&#xff0c;不僅是國內專業的互聯網基礎應用服務提供商之一&#xff0c;還是國家工信部認定的綜合電信服務運營…

OpenJDK Maven 編譯出錯: package jdk.nashorn.internal.runtime.logging does not exist

前言 OpenJDK 1.8.0Maven 3.8.5TencentOS Server 3.1 錯誤信息 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project tour-common: Compilation failure: Compilation failure: [ERROR] /opt/tour-c…

JavaScript預編譯機制

變量預編譯 任何變量&#xff0c;如果未經聲明就賦值&#xff0c;此變量是屬于 window 的屬性&#xff0c;而且不會做變量提升&#xff0c;無論在哪個作用域內賦值。比如說直接寫 console.log(a)肯定會報錯&#xff0c;提示找不到 a。但如果直接寫 a 100就不會報錯&#xff0…

【Linux命令行與Shell腳本編程】第十九章 正則表達式

Linux命令行與Shell腳本編程 第十九章 正則表達式 文章目錄 Linux命令行與Shell腳本編程 第十九章 正則表達式九.正則表達式9.1.正則表達式基礎9.1.1.正則表達式的類型9.2.定義BRE模式9.2.1.普通文本9.2.2.特殊字符 9.2.3.錨點字符錨定行首^錨定行尾$組合錨點 9.2.4.點號字符\.…

funbox3靶場滲透筆記

funbox3靶場滲透筆記 靶機地址 https://download.vulnhub.com/funbox/Funbox3.ova 信息收集 fscan找主機ip192.168.177.199 .\fscan64.exe -h 192.168.177.0/24___ _/ _ \ ___ ___ _ __ __ _ ___| | __/ /_\/____/ __|/ __| __/ _ |/ …

SpringBoot復習(39)Servlet容器的自動配置原理

Servlet容器自動配置類為ServletWebServerFactoryAutoConfiguration 可以看到通過Import注解導入了三個配置類&#xff1a; 通過這個這三個配置類可以看出&#xff0c;它們都使用了ConditionalOnClass注解&#xff0c;當類路徑存在tomcat相關的類時&#xff0c;會配置一個T…

【數據結構?堆】序列和的前n小元素

題目描述 問題&#xff1a;序列和的前n小元素   給出兩個長度為n的有序表A和B, 在A和B中各任取一個, 可以得到 n^2 個和. 求這些和最小的n個。 輸入輸出格式 輸入格式&#xff1a; 輸入數據共三行。   第一行&#xff0c;一個整數值n &#xff08; n < 10^4 &#xff…

Linux系列:從0到1用Docker部署springboot項目

目錄 1.前提條件 2.編寫DockerFile鏡像文件 3.打包SpringBoot項目 4.通過軟件Xftp進行傳輸&#xff08;*&#xff09; 1.點擊“文件-新建”?編輯 5.操作遠程主機 1.docker構建 2.容器運行 6.容器的關閉和刪除 1.前提條件 Linux、docker、xftp的安裝、一臺可以訪問的遠…

教雅川學纏論07-中樞實戰眾泰汽車000980

本文實戰眾泰汽車 下面是2023年11月14-2023年8月8眾泰汽車日K圖 先畫日K 接下來處理包含&#xff0c;就變成下面這個樣子 下面在套上纏論的理論&#xff0c;未來股價的走勢應該是紅色橢圓形虛線里面的樣子 好了&#xff0c;文章就到這里&#xff0c;如果眾泰最終不是這個走勢…

linux 目錄操作命令

目錄操作命令 文件列表 ls命令文件列表 ls [選項] [參數]-------------------------------l 詳細信息-L 緊接著符號性連接&#xff0c;列出它們指向的文件-a 所有文件&#xff0c;包含隱藏文件(以點號起始的文件)-A 與-a相同&#xff0c;但是不會列出來. 和 ..-c 根據創建時間排…

IDEA部署配置Maven項目教程,IDEA配置Tomcat(2019.3.3)

一、前言 當涉及到軟件開發和項目管理時&#xff0c;使用一個可靠的構建工具是非常重要的。Maven是一個廣泛使用的構建工具&#xff0c;它為Java項目提供了一種簡化的構建過程和依賴管理。 在本文中&#xff0c;我們將探討如何部署Maven并開始使用它來構建您的項目。我們將介紹…

Java基礎篇--淺拷貝和深拷貝

概念 淺拷貝&#xff08;Shallow Copy&#xff09;和深拷貝&#xff08;Deep Copy&#xff09;是在對象復制過程中常用的概念。 淺拷貝是指創建一個新對象&#xff0c;并將原始對象的非靜態字段的值拷貝到新對象中。如果字段是基本數據類型&#xff0c;直接復制其值&#xf…

開源數據庫Mysql_DBA運維實戰 (修改root密碼)

MySQL——修改root密碼的4種方法 本文以windows為例為大家詳細介紹下MySQL修改root密碼的4種方法&#xff0c;大家可以可以根據的自己的情況自由選擇&#xff0c;希望對大家有所幫助 方法1&#xff1a; 用SET PASSWORD命令 首先登錄MySQL。 格式&#xff1a;mysql> set pass…

Android APK體積優化(瘦身)

1、基礎知識&#xff1a; 1.1 apk結構 lib &#xff1a;存放so文件&#xff0c;對應不同的cpu架構 res &#xff1a;資源文件&#xff0c;layout、drawable等&#xff0c;經過aapt編譯 assets &#xff1a;資源文件&#xff0c;不經過aapt編譯 classes.dex &#xff1a;dx編譯…

爬蟲:使用Selenium模擬人工操作及獲取網頁內容

專欄介紹 結合自身經驗和內部資料總結的Python教程,每天3-5章,最短1個月就能全方位的完成Python的學習并進行實戰開發,學完了定能成為大佬!加油吧!卷起來! 全部文章請訪問專欄:《Python全棧教程(0基礎)》 再推薦一下最近熱更的:《大廠測試高頻面試題詳解》 該專欄對…