亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

STM32串口如何代碼實現更穩定的接收消息

2019-11-06 07:24:21
字體:
來源:轉載
供稿:網友

在 《STM32串口向世界問好》介紹過如何發送消息,那么又如何接收消息呢?

也很簡單,只需要配置好串口接收,配置好中斷,并在串口中斷函數里面進行數據接收就可以了。通用配置代碼如下:

/**  * @brief  初始化IO 串口1  * @param  bound:波特率  * @retval None  */void USART1_Debug_Init(u32 bound){    //GPIO端口設置    GPIO_InitTypeDef GPIO_InitStructure;    USART_InitTypeDef USART_InitStructure;    NVIC_InitTypeDef NVIC_InitStructure;    assert_param(bound >0 && bound <= 256000);    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);    USART_DeInit(USART1);  //復位串口1    //USART1_TX   PA.9    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //復用推挽輸出    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9    //USART1_RX   PA.10    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入    GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10    //USART 初始化設置    USART_InitStructure.USART_BaudRate = bound;    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數據格式    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); //初始化串口    NVIC_PRiorityGroupConfig(NVIC_PriorityGroup_2);    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2 ;    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    NVIC_Init(&NVIC_InitStructure);     USART_ClearFlag(USART1, USART_FLAG_TC);//防止第一個數據被覆蓋    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啟中斷    USART_Cmd(USART1, ENABLE);                    //使能串口}

中斷處理接收函數為:

 void USART1_IRQHandler(void){    u8 res;    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷 有數據為 1 SET    {        res = (u8)USART_ReceiveData(USART1);        res = res ;    }}

如果此時需要判斷當接收的數據為1時點亮LED1,當接收數據為2時熄滅LED1則可在中斷里作如下處理:

 void USART1_IRQHandler(void){    u8 res;    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷 有數據為 1 SET    {        res = (u8)USART_ReceiveData(USART1);         if(0x01 == res)        {            LED1 = ON ;         }        if(0x02 == res)        {            LED1 = OFF ;         }    }}

但這種接收控制方法是不夠穩定與靈活的,比如在傳輸的過程中受到干擾,0x01 變成 0x02,則就會出現錯誤的控制。又比如我要接收一串數據并進行處理,這樣就不好控制了。

這時我們就要想著制定一套通信協議來方便通信。

在此介紹一種簡單通信協議,是我在設計一款無人機數據鏈通信時用到的一開源協議:MAVLink,另外加上CRC校驗,進一步保證接收數據的可靠性。

其通信數據格式如下:

STM32串口如何代碼實現更穩定的接收消息

紅色部分代表起始幀 STX 為 0xFE ; LEN表示要發送的數據長度(PAYLOAD長度);SEQ表示數據的序列號,循環從0至255發送(可以檢測是否丟包,并可能過此來判斷信號強度);SYS是用來表示區分同一網絡中不同飛行器號的,即系統ID;COMP代表組件ID,表示飛行器上各個組成部分,如飛控單元,GPS等;MSG則代表消息ID,即要發送不同控制命令ID;PAYLOAD表示此命令的內容;最后兩字節是自動生的的CRC校驗碼 。

從上圖也可以看出PAYLOAD有效長度可為0至255字節(因為LEN來表示,它們都是無符號8位數據類型),所以一條消息長度最小為8字節,最大為263字節。

至此一簡單通信協議就介紹過了,說的有點多。下面就是如何對其解析,話不多說直接代碼說明:

#define MavlinkLenMin  8#define MavlinkLenMax  263#define STX      0xFE//MAVLINK HEAD#define Add_STX  0x00#define Add_LEN  0x01#define Add_SEQ  0x02#define Add_SYS  0x03#define Add_COMP 0x04#define Add_MSG  0x05#define Add_PAYLOAD  0x06//PAYLOAD start from 0x06typedef enum {BEEN_RECEIVED = 0, RECEIVING = !BEEN_RECEIVED} Receive_Status;typedef struct{    boolean Get ;    u16 Len ;    u8 Cache[MavlinkLenMax];}MAVLink_Data_Struct , * MAVLink_Data_Struct_p ; MAVLink_Data_Struct Msg_Rev ; void Msg_Recv_Data_Analyse_Irq(u8 data){    if(RECEIVING == Msg_Rev.Get){        Msg_Rev.Cache[Msg_Rev.Len++] = data;        if(STX != Msg_Rev.Cache[Add_STX]){            Msg_Rev.Len = 0 ;        }        if(((u16)Msg_Rev.Cache[Add_LEN] + MavlinkLenMin)==Msg_Rev.Len){            Msg_Rev.Get = BEEN_RECEIVED ;        }    }}

可在串口中斷接收函數里調用此函數用作協議數據接收解析

void USART1_IRQHandler(void){    u8 res;    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷 有數據為 1 SET    {        res = (u8)USART_ReceiveData(USART1);        Msg_Recv_Data_Analyse_Irq(res);    }}

當一條消息接收完成后,Msg_Rev.Get的狀態就會被設置成BEEN_RECEIVED ,這時就可在相關函數中對此條消息進行處理。

另外為了消息的更可靠,還可加入CRC校驗,如下函數就是一簡單通用的CRC16校驗碼生成函數:

u16 crc_chk_value(u8 *data_value){    u16 crc_value = 0xFFFF;         u16 length = (uint16_t)data_value[1] + 6;    u16  i;    while(length--)    {        crc_value ^= *data_value++;        for(i=0;i<8;i++)        {            if(crc_value & 0x0001)                crc_value = (crc_value >>1) ^ 0xa001;            else                crc_value=crc_value >> 1;        }    }    return(crc_value);}

如上述的對LED燈控制,我們可以作如下簡單設計,設定發送操控數據的設備SYS ID為1,假定組件串口1的ID為1,消息ID也為1,另外發送的數據長度也為1,則解析控制函數如:

void Msg_Control_Process(void){    u16 checksum;    if(BEEN_RECEIVED == Msg_Rev.Get){        checksum = crc_chk_value(Msg_Rev.Cache);        if( (Msg_Rev.Cache[Msg_Rev.Cache[Add_LEN] + 6 + 1] == (checksum & 0xFF)) &&                (Msg_Rev.Cache[Msg_Rev.Cache[Add_LEN] + 6 + 2] == ((checksum >> 8) & 0xFF)) ){            if( (0x01 == Msg_Rev.Cache[Add_SYS]) && (0x01 == Msg_Rev.Cache[Add_COMP]) ){                if(0x01 == Msg_Rev.Cache[Msg_Rev.Cache[Add_LEN] + 6]){                    LED1 = ON ;                }                if(0x02 ==  Msg_Rev.Cache[Msg_Rev.Cache[Add_LEN] + 6]){                    LED1 = OFF ;                }            }        }        Msg_Rev.Get = RECEIVING ;        Msg_Rev.Len = 0;    }}

此函數可在主輪詢里調用,當中斷里正常接收到一串消息后,就可以根據條件判斷及加處控制處理,處理完成后再繼續接收。因加入了CRC校驗及消息和組件ID檢測等,數據可靠性增加,當然軟件通信可靠性增強一般是通過增加冗余來實現,此也不例外。

稍微復雜的控制用此比較好,上面的例程用此只是作簡單原理性說明,有點大材小用的感覺 。

另在此設計中,你會發現,當接收完一條消息,處理完成后才接收下一條。這樣,當處理過程較費時間,并且消息在不斷的快速發送時,就容易引起丟包現象 ,所以以上設計并不是很好的。那么這個又如何解決呢?

待我研究下,下篇將會作詳細介紹 。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品爽爽ⅴa在线观看| 久久久久久久国产精品视频| 欧美色图在线视频| 日韩av免费看网站| 91精品国产高清久久久久久久久| 亚洲国产福利在线| 日韩av电影在线播放| 最好看的2019的中文字幕视频| 欧美大学生性色视频| 久久偷看各类女兵18女厕嘘嘘| 亚洲最大成人网色| 国产精品九九九| 亚洲r级在线观看| 日韩在线观看免费全集电视剧网站| 日韩中文字幕在线精品| 欧美激情亚洲综合一区| 欧美在线www| 欧美日韩一区二区在线播放| 影音先锋欧美在线资源| 日韩久久精品成人| 最新国产精品拍自在线播放| 国产精品中文久久久久久久| 午夜精品久久久久久久99热浪潮| 理论片在线不卡免费观看| 国产精品美女无圣光视频| 欧美另类69精品久久久久9999| 日本国产欧美一区二区三区| 久久视频在线播放| 亚洲国产精品字幕| 亚洲精品国产综合久久| 亚洲午夜av久久乱码| 黑人巨大精品欧美一区二区免费| 精品久久久香蕉免费精品视频| 91成人天堂久久成人| 欧美野外猛男的大粗鳮| 亚洲夜晚福利在线观看| 福利二区91精品bt7086| 日韩中文字幕不卡视频| 国产日韩欧美日韩| 国产精品久久久精品| 精品无码久久久久久国产| xxav国产精品美女主播| 久久人人爽人人爽人人片av高清| 国产精品久久久久久五月尺| 国产91亚洲精品| 亚洲第一二三四五区| 91影视免费在线观看| 国产mv免费观看入口亚洲| 7777精品久久久久久| 精品偷拍一区二区三区在线看| 亚洲精品美女免费| 91福利视频在线观看| 亚洲系列中文字幕| 国产午夜精品一区二区三区| 色综合色综合久久综合频道88| 久久天天躁狠狠躁老女人| 亚洲变态欧美另类捆绑| 欧美日韩国产精品一区二区三区四区| 国产精品入口夜色视频大尺度| 欧美电影在线观看网站| 日韩精品在线观看网站| 久久视频精品在线| 亚洲香蕉伊综合在人在线视看| 国产精品影院在线观看| 一区二区三区四区视频| 欧美成人在线免费视频| 狠狠做深爱婷婷久久综合一区| 久久九九国产精品怡红院| 欧美日韩国产综合视频在线观看中文| 欧美激情一区二区久久久| 亚洲第一中文字幕| 日韩精品在线私人| 国产一区二区三区精品久久久| 欧洲s码亚洲m码精品一区| 成人av电影天堂| 国产精品视频1区| 亚洲欧美日韩一区二区三区在线| 国内精品国产三级国产在线专| 欧美精品18videos性欧美| 欧美一级片一区| 亚洲成av人乱码色午夜| 国产91在线播放九色快色| 国产成人精品一区二区三区| 久久这里只有精品视频首页| 大胆欧美人体视频| 亚洲福利精品在线| 中文字幕亚洲一区| 精品亚洲一区二区三区在线播放| 日产精品99久久久久久| 欧美国产在线视频| 亚洲欧洲中文天堂| 久久av中文字幕| 欧美福利视频网站| 国产91精品高潮白浆喷水| 欧美重口另类videos人妖| 日本精品一区二区三区在线播放视频| 日韩av在线一区二区| 国产精品久久久久国产a级| 高跟丝袜欧美一区| 欧美日韩免费网站| 日韩人在线观看| 成人观看高清在线观看免费| 久久精品国产69国产精品亚洲| 亚洲bt欧美bt日本bt| 亚洲自拍偷拍色图| 国产在线观看91精品一区| 成人www视频在线观看| 亚洲精品99久久久久中文字幕| 欧美激情综合色综合啪啪五月| 热99久久精品| 色偷偷av亚洲男人的天堂| 国产91对白在线播放| 亚洲欧洲偷拍精品| 欧美日韩中文字幕在线视频| 久久久av亚洲男天堂| 久久的精品视频| 亚洲国产成人精品久久久国产成人一区| 日本久久久久久久| 91国产中文字幕| 国产精品v日韩精品| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品揄拍500视频| 亲子乱一区二区三区电影| 亚洲人成在线播放| 国产日韩欧美在线观看| 九九热这里只有精品免费看| 欧美日韩性生活视频| 亚洲精品乱码久久久久久金桔影视| 亚洲成年人在线| 欧美国产第二页| 主播福利视频一区| 九九久久久久99精品| 美日韩在线视频| 国产精品成人观看视频国产奇米| 狠狠做深爱婷婷久久综合一区| 欧美整片在线观看| 亚洲女人被黑人巨大进入| 中文字幕久热精品在线视频| 国产精品第3页| 中文字幕在线成人| 国产一区二区三区视频| 欧美精品成人在线| 高清在线视频日韩欧美| 亚洲国产女人aaa毛片在线| 另类图片亚洲另类| 亚洲tv在线观看| 国产在线不卡精品| 日韩av成人在线观看| 国产一区二区三区在线观看网站| 国产一区二区三区在线观看视频| 国产精品扒开腿做爽爽爽的视频| 中文字幕国产亚洲2019| 最新亚洲国产精品| 91精品国产九九九久久久亚洲| 亚洲国产精品va在看黑人| www.日韩系列| 色偷偷av亚洲男人的天堂| 国产脚交av在线一区二区| 久久久久久久久网站| 久久人人爽人人| 国产亚洲欧美日韩精品| 色偷偷亚洲男人天堂| www.日韩免费| 国产精品美女视频网站|