当前位置:首页 > 单片机 > 单片机
[导读]在 《STM32串口向世界问好》介绍过如何发送消息,那么又如何接收消息呢?也很简单,只需要配置好串口接收,配置好中断,并在串口中断函数里面进行数据接收就可以了。通用配置代码如下:/***@brief初始化IO串口1*@par

在 《STM32串口向世界问好》介绍过如何发送消息,那么又如何接收消息呢?

也很简单,只需要配置好串口接收,配置好中断,并在串口中断函数里面进行数据接收就可以了。通用配置代码如下:

/***@brief初始化IO串口1*@parambound:波特率*@retvalNone*/voidUSART1_Debug_Init(u32bound){//GPIO端口设置GPIO_InitTypeDefGPIO_InitStructure;USART_InitTypeDefUSART_InitStructure;NVIC_InitTypeDefNVIC_InitStructure;assert_param(bound>0&&bound<=256000);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);USART_DeInit(USART1);//复位串口1//USART1_TXPA.9GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//PA.9GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA9//USART1_RXPA.10GPIO_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);//使能串口}

中断处理接收函数为:

voidUSART1_IRQHandler(void){u8res;if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//接收中断有数据为1SET{res=(u8)USART_ReceiveData(USART1);res=res;}}

如果此时需要判断当接收的数据为1时点亮LED1,当接收数据为2时熄灭LED1则可在中断里作如下处理:

voidUSART1_IRQHandler(void){u8res;if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//接收中断有数据为1SET{res=(u8)USART_ReceiveData(USART1);if(0x01==res){LED1=ON;}if(0x02==res){LED1=OFF;}}}

但这种接收控制方法是不够稳定与灵活的,比如在传输的过程中受到干扰,0x01 变成 0x02,则就会出现错误的控制。又比如我要接收一串数据并进行处理,这样就不好控制了。

这时我们就要想着制定一套通信协议来方便通信。

在此介绍一种简单通信协议,是我在设计一款无人机数据链通信时用到的一开源协议:MAVLink,另外加上CRC校验,进一步保证接收数据的可靠性。

其通信数据格式如下:


红色部分代表起始帧 STX 为 0xFE ; LEN表示要发送的数据长度(PAYLOAD长度);SEQ表示数据的序列号,循环从0至255发送(可以检测是否丢包,并可能过此来判断信号强度);SYS是用来表示区分同一网络中不同飞行器号的,即系统ID;COMP代表组件ID,表示飞行器上各个组成部分,如飞控单元,GPS等;MSG则代表消息ID,即要发送不同控制命令ID;PAYLOAD表示此命令的内容;最后两字节是自动生的的CRC校验码 。

从上图也可以看出PAYLOAD有效长度可为0至255字节(因为LEN来表示,它们都是无符号8位数据类型),所以一条消息长度最小为8字节,最大为263字节。

至此一简单通信协议就介绍过了,说的有点多。下面就是如何对其解析,话不多说直接代码说明:

#defineMavlinkLenMin8#defineMavlinkLenMax263#defineSTX0xFE//MAVLINKHEAD#defineAdd_STX0x00#defineAdd_LEN0x01#defineAdd_SEQ0x02#defineAdd_SYS0x03#defineAdd_COMP0x04#defineAdd_MSG0x05#defineAdd_PAYLOAD0x06//PAYLOADstartfrom0x06typedefenum{BEEN_RECEIVED=0,RECEIVING=!BEEN_RECEIVED}Receive_Status;typedefstruct{booleanGet;u16Len;u8Cache[MavlinkLenMax];}MAVLink_Data_Struct,*MAVLink_Data_Struct_p;MAVLink_Data_StructMsg_Rev;voidMsg_Recv_Data_Analyse_Irq(u8data){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;}}}

可在串口中断接收函数里调用此函数用作协议数据接收解析

voidUSART1_IRQHandler(void){u8res;if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//接收中断有数据为1SET{res=(u8)USART_ReceiveData(USART1);Msg_Recv_Data_Analyse_Irq(res);}}

当一条消息接收完成后,Msg_Rev.Get的状态就会被设置成BEEN_RECEIVED ,这时就可在相关函数中对此条消息进行处理。

另外为了消息的更可靠,还可加入CRC校验,如下函数就是一简单通用的CRC16校验码生成函数:

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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭