收藏官网首页
查看: 16401|回复: 3

STM32版代码学习笔记二:UART分析

4

主题

7

帖子

102

积分

注册会员

Rank: 2

积分
102
跳转到指定楼层
楼主
发表于 2015-8-5 23:18:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
校园创客福利
本帖最后由 netlhx 于 2015-8-6 08:18 编辑

WIFI模块通过串口与MCU通信,所以接下来就是初始化串口。
  1. void UARTx_Init(void)
  2. {
  3.         UART_GPIO_Init();
  4.         UART_Config();
  5.         NVIC_Configuration();
  6. }
复制代码
串口代码分三步来实现
  • 初始化GPIO
  • 配置通信参数
  • 中断处理

由于gokit有几种版本,所以代码里面使用了宏定义来区分不硬件对应的UART,下面摘录部分代码来看看,hal_uart.h里面有一些定义
  1. #define Open_UART1
  2. #define Open_UART2
  3. #define Open_UART3
复制代码
这里分别定义了UART1到3,对应3个不同的串口,STM32版使用的是UART2,对应的GPIO为PA2及PA3

UART2参数配置
  1. #if defined (Open_UART2)        
  2.         USART_InitStructure.USART_BaudRate = 9600;
  3.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  4.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  5.         USART_InitStructure.USART_Parity = USART_Parity_No;
  6.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  7.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  8.         USART_Init(USART2, &USART_InitStructure);

  9.         USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
  10.         USART_Cmd(USART2, ENABLE);
复制代码
通信波特率为9600,开启了接收中断,这些配置都比较简单,复杂的在下面,也就是对接收到的信息进行分析及处理。

  1. extern UART_HandleTypeDef                                                          UART_HandleStruct;
  2. extern Device_ReadTypeDef               Device_ReadStruct;
  3. void USART2_IRQHandler(void)
  4. {
  5.         uint8_t         vlue;
  6.         
  7.   if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  8.   {
  9. //                printf("**\r\n");
  10.                 USART_ClearITPendingBit(USART2,USART_IT_RXNE);
  11.                 vlue = USART_ReceiveData(USART2);
  12.                 if(UART_HandleStruct.Package_Flag ==0)
  13.                 {
  14.                         
  15.                         if(UART_HandleStruct.UART_Flag1 ==0)
  16.                         {
  17.                                 if(vlue == 0xff)
  18.                                 {   
  19.                                                 UART_HandleStruct.UART_Count = 0;                                                
  20.                                                 UART_HandleStruct.UART_Buf[UART_HandleStruct.UART_Count]=vlue;
  21.                                                 UART_HandleStruct.UART_Count++;        
  22.                                                 UART_HandleStruct.UART_Flag1 = 1;
  23.                                 }                        
  24.                                 return ;
  25.                         }
  26.                         else if(UART_HandleStruct.UART_Flag2 ==0)
  27.                         {
  28.                                         UART_HandleStruct.UART_Buf[UART_HandleStruct.UART_Count]=vlue;
  29.                                         UART_HandleStruct.UART_Count++;
  30.                                         if(UART_HandleStruct.UART_Buf[1] == 0xff)
  31.                                         {
  32.                                                 UART_HandleStruct.UART_Flag2 = 1;        
  33.                                                 
  34.                                         }                                       
  35.                                         else
  36.                                         {
  37.                                                 UART_HandleStruct.UART_Flag1 = 0;
  38.                                         }
  39.                                         return ;
  40.                         }
  41.                         else
  42.                         {
  43.                                 UART_HandleStruct.UART_Buf[UART_HandleStruct.UART_Count] = vlue;
  44.                                 if(UART_HandleStruct.UART_Count >=4 && UART_HandleStruct.UART_Buf[UART_HandleStruct.UART_Count] == 0x55 && UART_HandleStruct.UART_Buf[UART_HandleStruct.UART_Count - 1] == 0xFF)
  45.                                 {}
  46.                                 else
  47.                                 UART_HandleStruct.UART_Count++;
  48.                                 if(UART_HandleStruct.UART_Count == 0x04)
  49.                                 {
  50.                                         UART_HandleStruct.UART_Cmd_len = UART_HandleStruct.UART_Buf[2]*256+  UART_HandleStruct.UART_Buf[3];         

  51.                                 }
  52.                                 if(UART_HandleStruct.UART_Count ==  (UART_HandleStruct.UART_Cmd_len + 4))
  53.                                 {
  54.                                         UART_HandleStruct.Package_Flag = 1;
  55.                                         UART_HandleStruct.UART_Flag1 = 0;
  56.                                         UART_HandleStruct.UART_Flag2 = 0;
  57. //                                        printf("Package_Flag =1 \r\n");
  58.                                 }        
  59.                         }
  60.                 }               
  61.   }        
  62.         
  63. }
复制代码


要想看懂这一段代码,就必须看通信协议了,这些通信协议都是官方定义好的,其实也不用完全看懂,照搬就是了。

这里附上官方的介绍
宠物屋产品设备端开发指南.pdf (382.21 KB, 下载次数: 29)

上面一段代码的作用,就是逐字符接收,根据收到的内容进行排重,直到接收到一个完整的协议包。

根据这一句的内容UART_HandleStruct.UART_Cmd_len = UART_HandleStruct.UART_Buf[2]*256+  UART_HandleStruct.UART_Buf[3];         发送过来的数据应该是大端格式。

4

主题

16

帖子

78

积分

注册会员

Rank: 2

积分
78
沙发
发表于 2015-8-6 21:46:16 | 只看该作者
协议看的有点迷糊,大致意思是通过串口中断收到数据,然后再组合

5

主题

63

帖子

860

积分

高级会员

Rank: 4

积分
860
板凳
发表于 2015-8-7 22:40:33 | 只看该作者
学习了,感谢分享!!

3

主题

24

帖子

136

积分

注册会员

Rank: 2

积分
136
地板
发表于 2015-8-10 07:54:25 | 只看该作者
学习中,感谢分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表