|
本帖最后由 netlhx 于 2015-8-6 08:18 编辑
WIFI模块通过串口与MCU通信,所以接下来就是初始化串口。
- void UARTx_Init(void)
- {
- UART_GPIO_Init();
- UART_Config();
- NVIC_Configuration();
- }
复制代码 串口代码分三步来实现
由于gokit有几种版本,所以代码里面使用了宏定义来区分不硬件对应的UART,下面摘录部分代码来看看,hal_uart.h里面有一些定义
- #define Open_UART1
- #define Open_UART2
- #define Open_UART3
复制代码 这里分别定义了UART1到3,对应3个不同的串口,STM32版使用的是UART2,对应的GPIO为PA2及PA3
UART2参数配置
- #if defined (Open_UART2)
- USART_InitStructure.USART_BaudRate = 9600;
- 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(USART2, &USART_InitStructure);
- USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
- USART_Cmd(USART2, ENABLE);
复制代码 通信波特率为9600,开启了接收中断,这些配置都比较简单,复杂的在下面,也就是对接收到的信息进行分析及处理。
- extern UART_HandleTypeDef UART_HandleStruct;
- extern Device_ReadTypeDef Device_ReadStruct;
- void USART2_IRQHandler(void)
- {
- uint8_t vlue;
-
- if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
- {
- // printf("**\r\n");
- USART_ClearITPendingBit(USART2,USART_IT_RXNE);
- vlue = USART_ReceiveData(USART2);
- if(UART_HandleStruct.Package_Flag ==0)
- {
-
- if(UART_HandleStruct.UART_Flag1 ==0)
- {
- if(vlue == 0xff)
- {
- UART_HandleStruct.UART_Count = 0;
- UART_HandleStruct.UART_Buf[UART_HandleStruct.UART_Count]=vlue;
- UART_HandleStruct.UART_Count++;
- UART_HandleStruct.UART_Flag1 = 1;
- }
- return ;
- }
- else if(UART_HandleStruct.UART_Flag2 ==0)
- {
- UART_HandleStruct.UART_Buf[UART_HandleStruct.UART_Count]=vlue;
- UART_HandleStruct.UART_Count++;
- if(UART_HandleStruct.UART_Buf[1] == 0xff)
- {
- UART_HandleStruct.UART_Flag2 = 1;
-
- }
- else
- {
- UART_HandleStruct.UART_Flag1 = 0;
- }
- return ;
- }
- else
- {
- UART_HandleStruct.UART_Buf[UART_HandleStruct.UART_Count] = vlue;
- 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)
- {}
- else
- UART_HandleStruct.UART_Count++;
- if(UART_HandleStruct.UART_Count == 0x04)
- {
- UART_HandleStruct.UART_Cmd_len = UART_HandleStruct.UART_Buf[2]*256+ UART_HandleStruct.UART_Buf[3];
- }
- if(UART_HandleStruct.UART_Count == (UART_HandleStruct.UART_Cmd_len + 4))
- {
- UART_HandleStruct.Package_Flag = 1;
- UART_HandleStruct.UART_Flag1 = 0;
- UART_HandleStruct.UART_Flag2 = 0;
- // printf("Package_Flag =1 \r\n");
- }
- }
- }
- }
-
- }
复制代码
要想看懂这一段代码,就必须看通信协议了,这些通信协议都是官方定义好的,其实也不用完全看懂,照搬就是了。
这里附上官方的介绍
宠物屋产品设备端开发指南.pdf
(382.21 KB, 下载次数: 29)
上面一段代码的作用,就是逐字符接收,根据收到的内容进行排重,直到接收到一个完整的协议包。
根据这一句的内容UART_HandleStruct.UART_Cmd_len = UART_HandleStruct.UART_Buf[2]*256+ UART_HandleStruct.UART_Buf[3]; 发送过来的数据应该是大端格式。
|
|