stm32串口編程實例-實現數據的收發功能

大家好,今天給大家介紹stm32串口編程實例,文章末尾附有分享大家一個資料包,差不多150多G。里面學習內容、面經、項目都比較新也比較全!可進群免費領取。

串口是USART(通用同步/異步收發器)的俗稱。

實際上,串行總線并不只有USART,還包含IIC、SPI、CAN、K線、單總線、USB、485等等總線,只是因為UART用得較多,習慣上叫做“串口”。

首先來看下UART的通信模型:

設備1與設備2進行通信

TXD:發送端,負責發送數據

RXD:接收端,負責接收數據

GND:地線,保證設備1與設備2有相同的參考電壓,保證通信的正常進行。

從模型上我們可以看出UART(USART是同步通信,在這個模型的基礎上都一條始終控制總線,但不常用)是一個異步、全雙工、串行通信。既然是異步的,那么就需要控制設備1與設備2數據收發的速度一致性,也就是兩設備要有相同的波特率(bit/s一秒鐘能傳的),否則通信會出現數據傳輸錯誤。

現在我們配置stm32的串口1,實現與PC端上的串口助手實現通信。首先查看串口的引腳、查看芯片手冊上各引腳對用的復用功能等。

以下是實現代碼,主要是實現Uart1數據的收發。

void?USART1_Config(void)

{

GPIO_InitTypeDef?GPIO_InitStructure;

USART_InitTypeDef?USART_InitStructure;

//配置時鐘

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1?|?RCC_APB2Periph_GPIOA,?ENABLE);

/*?USART1?GPIO?config?*/

/*?Configure?USART1?Tx?(PA.09)?as?alternate?function?push-pull?*/

GPIO_InitStructure.GPIO_Pin?=?GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode?=?GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed?=?GPIO_Speed_50MHz;

GPIO_Init(GPIOA,?&GPIO_InitStructure);

/*?Configure?USART1?Rx?(PA.10)?as?input?floating?*/

GPIO_InitStructure.GPIO_Pin?=?GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode?=?GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA,?&GPIO_InitStructure);

/*?USART1?mode?config?*/

USART_InitStructure.USART_BaudRate?=?115200;

USART_InitStructure.USART_WordLength?=?USART_WordLength_8b;

USART_InitStructure.USART_StopBits?=?USART_StopBits_1;

USART_InitStructure.USART_Parity?=?USART_Parity_No?;

USART_InitStructure.USART_HardwareFlowControl?=?USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode?=?USART_Mode_Rx?|?USART_Mode_Tx;

USART_Init(USART1,?&USART_InitStructure);

//使能串口中斷

USART_ITConfig(USART1,?USART_IT_RXNE,?ENABLE);

//清空發送完成標志位

USART_ClearFlag(USART1,USART_FLAG_TC);

//使能串口

USART_Cmd(USART1,?ENABLE);

}

//定義printf函數接口(printf重定向)

int?fputc(int?ch,?FILE?*f)

{

USART_SendData(USART1,?(uint8_t)?ch);

while?(USART_GetFlagStatus(USART1,?USART_FLAG_TC)?==?RESET);

return?(ch);

}

//定義scanf函數接口(scanf重定向)

int?fgetc(FILE?*f)

{

while?(USART_GetFlagStatus(USART1,?USART_FLAG_RXNE)?==?RESET);

return?(int)USART_ReceiveData(USART1);

}

//發送字符

char?usart1_putc(char?ch)

{

USART_SendData(USART1,?(uint8_t)?ch);

while?(USART_GetFlagStatus(USART1,?USART_FLAG_TXE)?!=?SET);

return?(ch);

}

//發送字符串

int?usart1_putstr(unsigned?char*?buff,int?len)

{

int?i?=?0;

for(i?=?0;i?<?len;i++)

{

usart1_putc(buff[i]);

}

return?len;

}

//接收字符

char?usart1_getc(void)

{

char?temp?=?0;

while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)!=?SET);

temp?=?USART_ReceiveData(USART1);

return?temp;

}

//接收字符串

int?usart1_getstr(unsigned?char*?buff,int?len)

{

int?i?=?0;

for(i?=?0;i?<?len;i++)

{

buff[i]?=?usart1_getc();

}

return?len;

}

配置好之后,將這些函數放到頭文件中申明,并放到主函數中去初始化及調用,就可以實現數據的收發功能。

嵌入式物聯網需要學的東西真的非常多,千萬不要學錯了路線和內容,導致工資要不上去!

無償分享大家一個資料包,差不多150多G。里面學習內容、面經、項目都比較新也比較全!某魚上買估計至少要好幾十。

(點擊找小助理領取)掃碼進群領資料icon-default.png?t=N7T8https://s.pdb2.com/pages/20230519/16QijNiGb32IFIn.html

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

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

相關文章

2023年8月8日 Go生態洞察:Go 1.21 版本發布探索

&#x1f337;&#x1f341; 博主貓頭虎&#xff08;&#x1f405;&#x1f43e;&#xff09;帶您 Go to New World?&#x1f341; &#x1f984; 博客首頁——&#x1f405;&#x1f43e;貓頭虎的博客&#x1f390; &#x1f433; 《面試題大全專欄》 &#x1f995; 文章圖文…

中小企業都在用哪些開源項目管理工具?分享15款

推薦15個優秀的開源項目管理工具&#xff0c;比如&#xff1a;ProjectLibre、OpenProject、ERPNext、Redmine、禪道、Tuleap、Restyaboard等。 項目經理面臨各種復雜任務&#xff0c;包括追蹤任務的進度、評估交付風險和管理整體工作量。為了順利達成目標&#xff0c;一款靠譜的…

ALLEGRO PCB 如何設置增加的過孔

Allegro添加過孔 1、首先建立焊盤&#xff08;熱風焊盤&#xff09; Via20x10mil(tr30x45x12mil_45) 2、設置過孔的焊盤 Setup-->Constraints&#xff08;約束&#xff09;-->Physical 彈出以下對話框Allegro Constraint Manager 可以通過右鍵點擊PC S&#xff08;…

ArchLinux下載鏈接

LINUX花樣太多&#xff0c;不得不跟著別人要求。 Arch Linux - Downloads Index of /archlinux/iso/2023.12.01/

學習IO的第四天

作業 : 使用兩個子進程完成兩個文件的拷貝&#xff0c;子進程1拷貝前一半內容&#xff0c;子進程2拷貝后一般內容&#xff0c;父進程用于回收兩個子進程的資源 #include <head.h>int main(int argc, const char *argv[]) {int rd -1;if((rdopen("./01_test.c&quo…

零基礎如何入門HarmonyOS開發?

HarmonyOS鴻蒙應用開發是當前非常熱門的一個領域&#xff0c;許多人都想入門學習這個技術。但是&#xff0c;對于零基礎的人來說&#xff0c;如何入門確實是一個問題。下面&#xff0c;我將從以下幾個方面來介紹如何零基礎入門HarmonyOS鴻蒙應用開發學習。 一、了解HarmonyOS鴻…

[JSMSA_CTF] 2023年12月練習題 pwn

一開始沒給附件&#xff0c;還以為是3個盲pwn結果&#xff0c;pwn了一晚上沒出來&#xff0c;今天看已經有附件了。 pwn1 在init_0里使用mallopt(1,0) 設置global_max_fast0 任何塊釋放都會進入unsort在free函數里沒有清理指針&#xff0c;有UAF將v6:0x100清0&#xff0c;便于…

甘草書店:#10 2023年11月24日 星期五 「麥田創業分享2—世界奇奇怪怪,請保持可可愛愛」

今日繼續分享麥田創業經驗。 如果你問我&#xff0c;創業過程中是否想過放棄。那么答案是&#xff0c;有那么一次。 那時想要放棄的原因并不是辛苦沒有回報&#xff0c;或是資金短缺&#xff0c;而是沒能理解“異見者”。 其實事情非常簡單&#xff0c;現在反觀那時的自己&a…

實例解析關于兔鮮登錄tab欄切換案例詳細講解!

文章目錄 文章目錄 效果圖展示 整體制作的一個思路 代碼展示 技術細節 小結 效果圖展示 點擊賬戶登錄顯示登錄的模塊&#xff0c;點擊二維碼登錄顯示二維碼的模塊 整體制作的一個思路 點擊哪個模塊哪個顯示&#xff0c;另外一個模塊讓它隱藏即可&#xff01; 代碼展示 <!…

好萊塢明星識別

一、前期工作 1. 設置GPU from tensorflow import keras from tensorflow.keras import layers,models import os, PIL, pathlib import matplotlib.pyplot as plt import tensorflow as tfgpus tf.config.list_physical_devices("GPU")if gpus:gpu0 …

動態規劃——完全背包問題(公式推導,組合、排列)

本文章是對于完全背包 一些題型(如題目所示&#xff0c;組合、排列和最小值類型)的總結和理解&#xff0c;依次記錄一下&#xff0c;方便回顧與復習。 本文章是基于個人所總結 實現的&#xff0c;但在其中遇到了一些疑惑與困難&#xff0c;所以總結一篇與完全背包相關的問題。 …

Spring基于注解開發

Component的使用 基本Bean注解&#xff0c;主要是使用注解的方式替代原有的xml的<bean>標簽及其標簽屬性的配置&#xff0c;使用Component注解替代<bean>標簽中的id以及class屬性&#xff0c;而對于是否延遲加載或是Bean的作用域&#xff0c;則是其他注解 xml配置…

IntelliJ IDEA 的 HTTP 客戶端的高級用法

本心、輸入輸出、結果 文章目錄 IntelliJ IDEA 的 HTTP 客戶端的高級用法前言HTTP 請求對 gRPC 請求的支持對 GraphQL 和 WebSocket 請求的支持環境文件OpenAPI 補全用于持續集成的 HTTP 客戶端 CLI花有重開日,人無再少年實踐是檢驗真理的唯一標準IntelliJ IDEA 的 HTTP 客戶端…

keepalived 高可用主備

實驗采用兩臺centos9 nginxkeepalived 一共兩臺&#xff0c;進行主備切換 主服務器 192.168.100.105 備用 192.168.100.106 虛擬ip 192.168.100.200 安裝 dnf install vim wget curl vim net-tools nginx keepalivedUndefined nginx 配置需要更改為虛擬ip server {listen …

四招打造完美分層自動化測試框架,讓測試更高效!

寫在前面 我們剛開始做自動化測試&#xff0c;可能寫的代碼都是基于原生寫的代碼&#xff0c;看起來特別不美觀&#xff0c;而且感覺特別生硬。 來看下面一段代碼&#xff1a; 具體表現如下&#xff1a; driver對象在測試類中顯示 定位元素的value值在測試類中顯示 定位元素…

Navicat 技術指引 | 適用于 GaussDB 分布式的用戶/權限功能

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式數據庫。GaussDB 分布式模式更適合對系統可用性和數據處理能力要求較高的場景。Navicat 工具不僅提供可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結…

干貨:軟文推廣中的關鍵詞類別有哪些?

軟文推廣如果想要增加文案曝光率&#xff0c;seo是其主要的傳播方式之一&#xff0c;因而好的關鍵詞十分重要&#xff0c;這里的關鍵詞指得是針對搜索引擎而言&#xff0c;由用戶輸入搜索引擎框中的提示性文字&#xff0c;只要關鍵詞設置得好&#xff0c;軟文就能通過搜索引擎精…

因為 postman環境變量全局變量設置好兄弟被公司優化了!

postman環境變量、全局變量設置 在公司中&#xff0c;一般會存在開發環境、測試環境、線上環境等&#xff0c;如果需要在不 同的環境下切換做接口測試&#xff0c;顯然我們需要把所有接口的域名進行修改&#xff0c;如果接 口測試用例較多&#xff0c;那么修改會非常費力&…

springboot(ssm大學生志愿者管理系統 志愿者管理平臺 Java系統

springboot(ssm大學生志愿者管理系統 志愿者管理平臺 Java系統 開發語言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服務器&#xff1a;tomcat 數據庫&#xff1a;mysql 5.7&#xff08;或8.0&#xff…

Python與ArcGIS系列(十五)根據距離抓取字段

目錄 0 簡述1 實例需求2 arcpy開發腳本0 簡述 在處理gis數據的時候,會遇到這種需求:將一個圖層與另一個圖層中相近的要素進行字段賦值。本篇將介紹如何利用arcpy及arcgis的工具箱實現這個功能。 1 實例需求 為了介紹這個功能的實現,我們需要有一個特定的功能需求。在這里選…