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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

STM32串口学习总结(经典)

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32串口学习总结(经典) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

主函數代碼如下:

#include "led.h" #include "delay.h" #include "sys.h" #include "usart.h" #include "arduino.h" //ALIENTEK Mini STM32?a·¢°?·?ày′ú??3 //′??úêμ?é //??ê??§3?£owww.openedv.com //1??YêDD?òíμ?×ó????óD?T1???int main(void){ u8 t;u8 len; u16 times=0; u8 ax;//u8 bx='*'; //*μ?êμ?ê?μ??êμ′ú±í0x42ò2?íê?ASCIIμ??μê?42delay_init(); //?óê±oˉêy3?ê??ˉ NVIC_Configuration();// éè???D??ó??è??·?×éuart_init(9600); //′??ú3?ê??ˉ?a9600LED_Init(); //3?ê??ˉó?LEDá??óμ?ó2?t?ó?ú USART3_Config(115200);while(1){delay_ms(100);LED0=1;LED1=1;//GPIO_ResetBits(GPIOA,GPIO_Pin_8);ax=arduino_Analysis();//printf("sudo=%d \r\n",sudu);//printf("ax=%d \r\n",ax);//printf("cx=%d \r\n",cx);//printf("%d \r\n",bx);//delay_ms(1000);//////////////////////////////////?-oˉêy // LED0=!LED0; // if(USART_RX_STA&0x8000) // { // len=USART_RX_STA&0x3fff;//μ?μ?′?′??óê?μ?μ?êy?Y3¤?è // printf("\r\n?ú·¢?íμ????¢?a:\r\n"); // for(t=0;t<len;t++) // { // USART1->DR=USART_RX_BUF[t]; // while((USART1->SR&0X40)==0);//μè′y·¢?í?áê? // } // printf("\r\n\r\n");//2?è???DD // USART_RX_STA=0; // }else // { // times++; // if(times%5000==0) // { // printf("\r\nALIENTEK MiniSTM32?a·¢°? ′??úêμ?é\r\n"); // printf("?yμ??-×ó@ALIENTEK\r\n\r\n\r\n"); // } // if(times%200==0)printf("??ê?è?êy?Y,ò???3μ?ü?áê?\r\n"); // //éá??LED,ìáê??μí3?y?ú??DD. // delay_ms(10); // //} // } } }

需要串口服務工程
建立與Arduino板子的通訊
.c程序如下:

#include "arduino.h"u8 Res=0; int i; u8 Arduino_sudo; u8 Arduino_jiaodu; u8 sudu; u8 jiaodu; u8 x=7; char cx; u8 USART3_RX_BUF[USART_REC_LEN]; //?óê??o3?,×?′óUSART_REC_LEN??×??ú. //?óê?×′ì? u8 Arduino_Receive_Data[10]; u8 Arduino_receive_counter=0; u8 Arduino_receive_flag=0; //u8 Arduino_receive_temp[10]={0x42,0x39,0x49,0x39,0x45,0x39,0x49,0x54,0x39,0X39}; u8 Arduino_receive_temp[10]; //u8 res[8]; //bit15£? ?óê?íê3é±ê?? //bit14£? ?óê?μ?0x0d //bit13~0£? ?óê?μ?μ?óDD§×??úêy?? u16 USART3_RX_STA=0; //?óê?×′ì?±ê?? void USART3_Config(u32 bound) //á??óêy′?μ?ì¨ 3?ê??ˉ ????USART2 {GPIO_InitTypeDef GPIO_InitStructure; //′??ú???ú?????á11ì?±?á?USART_InitTypeDef USART_InitStructure; //′??ú2?êy?????á11ì?±?á?NVIC_InitTypeDef NVIC_InitStructure;//μú12?£o′ò?aGPIOoíUSART2??tμ?ê±?óRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //′ò?aGPIOAê±?óoíGPIOA?′ó?ê±?óRCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //′ò?a′??ú?′ó?ê±?óUSART_DeInit(USART3); //?′??′??ú1//μú22?£o??USART2 Tx£¨·¢?í??£?μ?GPIO?????aí?íì?′ó??£ê?GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //′??ú2·¢?í??//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //?′ó?í?íìê?3?GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //ê?3??ù?è50MHzGPIO_Init(GPIOB, &GPIO_InitStructure); //3?ê??ˉGPIOA//μú32?£o??USART2 Rx£¨?óê???£?μ?GPIO?????a????ê?è??£ê?GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //′??ú2?óê???GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //????ê?è?//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //é?à-ê?è?GPIO_Init(GPIOB, &GPIO_InitStructure); //3?ê??ˉGPIOANVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ; //?à??ó??è?? 3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //×óó??è?? 3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ í¨μàê1?üNVIC_Init(&NVIC_InitStructure); //?D??ó??è??3?ê??ˉ//μú42?£o????USART12?êyUSART_InitStructure.USART_BaudRate = bound; //2¨ì??êéè??£o57600USART_InitStructure.USART_WordLength = USART_WordLength_8b; //êy?Y??êyéè??£o8??USART_InitStructure.USART_StopBits = USART_StopBits_1; //í£?1??éè??£o1??USART_InitStructure.USART_Parity = USART_Parity_No; //ê?·?????D£?é£o?TUSART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //ó2?tá÷?????£ê?éè??£o??óDê1?üUSART_InitStructure.USART_Mode = USART_Mode_Rx ;//| USART_Mode_Tx; //?óê?ó?·¢?í??ê1?üUSART_Init(USART3, &USART_InitStructure); //3?ê??ˉUSART2//′ò?a·¢?í?D??oí?óê??D??(è?1?Dèòa?D??)// USART_ITConfig(USART2, USART_IT_TXE, ENABLE); // ê1?ü???¨μ?USART1·¢?í?D?? £?USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); // ê1?ü???¨μ?USART1?óê??D?? £?//μú52?£oê1?ü USART2£? ????íê±?USART_Cmd(USART3, ENABLE); //ê1?ü USART2//è???ó????a??μú1??×??ú?T·¨?yè··¢?í3?è¥μ??êìaUSART_ClearFlag(USART3, USART_FLAG_TC); //??′??ú2·¢?í±ê??}void USART3_IRQHandler(void) //′??ú3?D??·t??3ìDò{if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //?óê??D??óDD§,è??óê?êy?Y??′??÷?ú{Arduino_receive_temp[Arduino_receive_counter]=USART_ReceiveData(USART3);// Res=USART_ReceiveData(USART3);// printf("res=%d",Res);// USART_SendData(USART3,Res);// LED1=!LED1;if((Arduino_receive_counter==0)&&(Arduino_receive_temp[0]!=42)) return;/////87=W ê×??LED0=0; // if( Arduino_Receive_Data[0]!=0x42) // { // Arduino_receive_counter++; // }elseArduino_receive_counter++;if(Arduino_receive_counter==9){Arduino_receive_counter=0;Arduino_receive_flag=1;}}}u8 arduino_Analysis() {if(Arduino_receive_flag==1){Arduino_receive_flag=0;memcpy(Arduino_Receive_Data,Arduino_receive_temp,8);//memcpy(Arduino_receive_temp,Arduino_Receive_Data,8);LED1=0; // for(i=0;i<8;i++) // { // // printf("Arduino_Receive_Data[%d]=%d\r\n",i,Arduino_Receive_Data[i]); // } }printf("sudu=%d \r\n",Arduino_Receive_Data[2]-48);jiaodu=(Arduino_Receive_Data[6]-48)*10+(Arduino_Receive_Data[7]-48);if(Arduino_Receive_Data[4]==45){printf("jiaodu=-%d \r\n",jiaodu);}else{printf("jiaodu=%d \r\n",jiaodu);}//cx=Arduino_receive_temp[2];//Res =Arduino_Receive_Data[Arduino_receive_counter]; //?áè??óê?μ?μ?êy?Y//return Arduino_receive_temp[2];//sudu=Arduino_receive_temp[7];}/////////////////////////////////////////////////////////////// Arduino.h的程序如下: #ifndef _ARDUINO_H #define _ARDUINO_H #include "stdio.h" #include "usart.h" #include "stm32f10x.h" #include "stm32f10x_conf.h" #include "string.h" #include "led.h" #include "sys.h" #include "delay.h"void USART3_Config(u32 bound); // //void USART3_IRQHandler(void); //void TIM4_Init(u16 arr,u16 psc); //void TIM4_IRQHandler(void); void TIM4_Init(u16 arr,u16 psc); u8 arduino_Analysis(void);#define USART3_REC_LEN 200 //?¨ò?×?′ó?óê?×??úêy 200 #define EN_USART3_RX 1 //ê1?ü£¨1£?/???1£¨0£?′??ú1?óê? extern u8 sudu; extern char cx; //è?1???′??ú?D???óê?£???2?òa×¢êíò???oê?¨ò?#endif

總結以及函數的說明,今天系統的學習了單片機的串口通訊,簡單的建立基于兩個單片機的通訊使用單片機型號是stm32f103 rct6
1.在MDK中建立工程的過程中,在函數dianC中定義的相關函數,都在點h中進行相應的聲明,但是除了void USART3_IRQHandler(void)以及void TIM4_Init(u16 arr,u16 psc)和void TIM4_IRQHandler(void) void TIM4_Init(u16 arr,u16 psc)。像串口中斷服務函數這樣的函數,在進行編程的時候它是在庫函數中已經定義好的函數,只要串口發生中中斷,就會進入串口中斷函數,執行相應的操作。除此之外所有的自己定義的函數都要在.h中進行相應的聲明。
2.要想在.h中進行引用自己編寫工程中的全局變量,例如使用Arduino.c中的變量sudo,要在Aduino.h中像如下:extern u8 sudu;外部一下才能夠使用
3.如果想在main.c中使用某個.c文件中相應的函數處理的某個數據,當遇到需要一個以上的數據的時候,使用return語句就顯得不合時宜,return處理這樣的數據也有點吃力,這時候可以考慮使用全局變量并在Arduino.h中進行extern一下就行了,使用的實例如下所示:

u8 Res=0; int i; u8 Arduino_sudo; u8 Arduino_jiaodu; u8 sudu; u8 jiaodu; u8 x=7; char cx; u8 arduino_Analysis() {if(Arduino_receive_flag==1){Arduino_receive_flag=0;memcpy(Arduino_Receive_Data,Arduino_receive_temp,8);//memcpy(Arduino_receive_temp,Arduino_Receive_Data,8);LED1=0;printf("sudu=%d \r\n",Arduino_Receive_Data[2]-48);jiaodu=(Arduino_Receive_Data[6]-48)*10+(Arduino_Receive_Data[7]-48);if(Arduino_Receive_Data[4]==45){printf("jiaodu=-%d \r\n",jiaodu);}else{printf("jiaodu=%d \r\n",jiaodu);}sudu=Arduino_receive_temp[7];} }

像sudu=Arduino_receive_temp[7];這時候在主函數想要引用只需要在Arduino.h中extern一下sudu就行了。全局變量可以直接相當于函數的返回在主函數中使用

4.串口中斷函數void USART3_IRQHandler(void)只要串口3進入中斷,就會跳到串口中斷函數void USART3_IRQHandler(void)處理串口中斷函數中的相應的命令。

5.關于串口調試助手相關的說明,在進行這個實驗的時候,由于串口3使用的bound是115200,但是串口1使用的bound是9600。當你使用串口打印函數:printf的時候,其實庫函數中是默認使用串口1進行打印的,因此配置串口的使用9600,而不是115200.因為雖然你使用的是串口3進行通訊,但是單片機與電腦的串口助手進行通訊使用的是串口1,因此無論在任何地方使用串口的打印函數都要使用串口1的配置環境。

6.ASCII問題說明:在進形多機通訊的時候,以Arduino板子為例。當Arduino板子發來數字1的時候,32的板子接收過來就是一個數字1,但是當Arduino的板子發來的是一串字符串的時候比如:‘,6,-,11,’,這個時候其實32的板子接收的是一串數字(補充:串口中所定義的8bit(11111111)0-255,字節(byte)這是計算機中數據類型最基本的單位了,8bit 組成1byte,因此串口在進行數據的傳輸的過程中是每次傳輸八個比特,一個字節也就是數據被拆分成一個一個字符的 進行數據傳送因此,數據,6,-,11,被拆分為(42 44 54 44 45 44 49 49)ASCII的形式)
如下形式

if((Arduino_receive_counter==0)&&(Arduino_receive_temp[0]!=42)) return;

if((Arduino_receive_counter==0)&&(Arduino_receive_temp[0]!=0x2a)) return;

所實現的功能是一樣的,進行通訊的時候,其它的單片機傳過來的數據都是一個一個的數字(0-255)形式進行解析的,因此開頭的“”*“”的ASCII碼就是42=0x2a寫成十六進制的還是十進制的都行,進行編譯之后單片機所接受的二進制的數是一樣的。

6.函數怎樣處理的說明,盡量不要在中斷服務函數中進行數據的處理,加上一個標志位再在中斷函數的外部進行函數的處理如下:

void USART3_IRQHandler(void) //′??ú3?D??·t??3ìDò{if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //?óê??D??óDD§,è??óê?êy?Y??′??÷?ú{Arduino_receive_temp[Arduino_receive_counter]=USART_ReceiveData(USART3);// Res=USART_ReceiveData(USART3);// printf("res=%d",Res);// USART_SendData(USART3,Res);// LED1=!LED1;if((Arduino_receive_counter==0)&&(Arduino_receive_temp[0]!=42)) return;/87=W ê×??//if((Arduino_receive_counter==0)&&(Arduino_receive_temp[0]!=0x2a)) return; //?μ?÷£?0x2a=42LED0=0; // if( Arduino_Receive_Data[0]!=0x42) // { // Arduino_receive_counter++; // }elseArduino_receive_counter++;if(Arduino_receive_counter==9){Arduino_receive_counter=0;Arduino_receive_flag=1;}}}u8 arduino_Analysis() {if(Arduino_receive_flag==1){Arduino_receive_flag=0;memcpy(Arduino_Receive_Data,Arduino_receive_temp,8);//memcpy(Arduino_receive_temp,Arduino_Receive_Data,8);LED1=0;printf("sudu=%d \r\n",Arduino_Receive_Data[2]-48);jiaodu=(Arduino_Receive_Data[6]-48)*10+(Arduino_Receive_Data[7]-48);if(Arduino_Receive_Data[4]==45){printf("jiaodu=-%d \r\n",jiaodu);}else{printf("jiaodu=%d \r\n",jiaodu);}sudu=Arduino_receive_temp[7];} }

就像上面的函數一樣定義一個全局的變量u8 Arduino_receive_flag=0;,當進入到中斷函數的時候就會是標志位置1,當標志位置1的時候函數u8 arduino_Analysis()中的if語句就開始執行`if(Arduino_receive_flag==1)
{

Arduino_receive_flag=0;memcpy(Arduino_Receive_Data,Arduino_receive_temp,8);//memcpy(Arduino_receive_temp,Arduino_Receive_Data,8);LED1=0; printf("sudu=%d \r\n",Arduino_Receive_Data[2]-48);

jiaodu=(Arduino_Receive_Data[6]-48)*10+(Arduino_Receive_Data[7]-48);
if(Arduino_Receive_Data[4]==45)
{
printf(“jiaodu=-%d \r\n”,jiaodu);
}else
{
printf(“jiaodu=%d \r\n”,jiaodu);
}

sudu=Arduino_receive_temp[7];

}`
到此處一個STM32的中斷函數學習基本的就可以自己進一步做了

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的STM32串口学习总结(经典)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 林雅儿欧洲留学恋爱日记在线 | 91麻豆映画传媒 | 手机av免费观看 | 在线看a级片 | 黑人多p混交群体交乱 | 亚洲精品一区二区三区四区 | 色婷婷av一区二区三区gif | 蜜桃av色偷偷av老熟女 | 2018天天操 | たちの熟人妻av一区二区 | 性色av一区 | 亚洲久久一区 | 亚洲专区av | 国产日韩在线视频 | 国产精品视频大全 | 中文字幕乱码人妻一区二区三区 | 欧美男女视频 | 久久久精品影视 | 久久亚洲AV成人无码国产野外 | 国模一区二区 | 国产精品系列在线播放 | 梦梦电影免费高清在线观看 | 91福利专区| 欧美成人一区在线观看 | 懂色av成人一区二区三区 | 男生操男生网站 | 日韩亚洲第一页 | 超碰成人免费电影 | 夜色视频在线观看 | 日本一区二区三区视频在线播放 | 中文字幕区 | 影音先锋毛片 | 德国经典free性复古xxxx | 激情五月激情综合网 | 顶弄h校园1v1| 五月天视频网 | 91成人在线免费观看 | 韩国三级视频在线观看 | 日本一区二区不卡在线观看 | 国产黑丝精品 | 伊人www | 黄色美女片| 青娱乐欧美| 成年人黄国产 | 亚洲小说区图片区都市 | 亚洲精品91天天久久人人 | 美女诱惑一区 | 韩国美女福利视频 | 精品91久久久 | 亚洲不卡在线视频 | 欧美一区三区三区高中清蜜桃 | 全部孕妇毛片丰满孕妇孕交 | 国产色片在线观看 | 韩日少妇 | 日日干天天干 | 午夜大片| 国产三级91 | 国产艳俗歌舞表演hd | 中文字幕 欧美日韩 | 狂野欧美性猛交blacked | 男人资源网站 | 夜夜精品一区二区无码 | 亚洲射射射 | av网站地址 | 成人观看 | 久久久久久国产精品无码 | 又大又粗欧美黑人aaaaa片 | 中文字幕国产在线 | 国产嫩草视频 | 久久免费电影 | 亚洲一区精品在线 | 国产一二三级 | www.精品一区 | 日日碰狠狠添天天爽无码av | 成人免费观看视频 | 中文字幕+乱码+中文字幕明步 | 日日摸夜夜爽 | 色涩色| 精品一区二区在线播放 | 精品91视频| 色视频免费看 | 久久午夜神器 | 深夜福利久久 | 97色网| 影音先锋在线国产 | a三级黄色片| 欧美日韩欧美 | 日日躁夜夜躁狠狠躁 | 乱h伦h女h在线视频 99999视频 | 91视频综合网 | 久久精品视频一区 | 捆绑无遮挡打光屁股调教女仆 | 青娱乐国产盛宴 | 日本一级理论片在线大全 | 欧美精品电影一区二区 | 播放一级黄色片 | 精品人妻av在线 | 一区二区在线国产 | 国产区一二 |