唐山网站建设方案报价,梵美传媒网站是谁做的,建筑学长官网,怎么申请建立一个公司网站接收不定长数据
Cubemx生成代码过程忽略
首先在main函数中创建接收缓存区 并在main.h中定义 接下来就是重写串口的中断函数中的内容#xff0c;把原有内容注释掉 main中创建一个记录接收数据长度的变量和标志位 然后再在主函数中添加一个验证代码#xff0c;这样MCU收到数据…接收不定长数据
Cubemx生成代码过程忽略
首先在main函数中创建接收缓存区 并在main.h中定义 接下来就是重写串口的中断函数中的内容把原有内容注释掉 main中创建一个记录接收数据长度的变量和标志位 然后再在主函数中添加一个验证代码这样MCU收到数据后会发送到电脑上 现在开始正式改写中断函数改为如下代码即可
void USART1_IRQHandler(void)
{/* USER CODE BEGIN USART1_IRQn 0 *//*重写内容*//*用于保存数据寄存器的变量*/uint16_t br 0;uint16_t temp USART1-SR;//状态寄存器 status //第五位读数据缓存区非空if (temp (1 5)){if (rxlencnt LEN)//没有超出缓存区{rxbuf[rxlencnt] USART1-DR0x1ff;//存入buf中rxlencnt ;}else{rxlencnt 0;//重置数组memset(rxbuf, 0, LEN);}USART1-SR ~(15);//重置标志位}if (temp (14))//检测到空闲线路即一帧数据接收完毕{flag 1;//标志位置1br USART1-DR;USART1-SR ~(14);//置0}/* USER CODE END USART1_IRQn 0 */
// HAL_UART_IRQHandler(huart1);/* USER CODE BEGIN USART1_IRQn 1 *//* USER CODE END USART1_IRQn 1 */
}
然后再在主函数中添加 while (1){/* USER CODE END WHILE */if (flag 1){flag 0;HAL_UART_Transmit(huart1, rxbuf, rxlencnt, rxlencnt);rxlencnt 0;memset(rxbuf, 0, LEN);}/* USER CODE BEGIN 3 */}
即可做到发送接收不定长数据
数据帧的接收并分析即接收数据包 void frame_control()
{if (flag ! 1) return ;flag 0;HAL_UART_Transmit(huart1, rxbuf, rxlencnt, rxlencnt);char *pstr1 NULL, *pstr2 NULL;char *str1 aa, *str2 55;/*strstr(str1, str2)-判断字符串str1中是否包含str2若str1中包含str2返回str2的起始地址否则返回NULL*/pstr1 strstr((char*)rxbuf, str1);pstr2 strstr((char*)rxbuf, str2);if ((pstr1 ! NULL) (pstr2 ! NULL)){if (((*pstr1 a)(*(pstr11) a))((*(pstr15) 5)(*(pstr16) 5))((*(pstr12)-0x30)(*(pstr13)-0x30)(*(pstr14)-0x30))){uint8_t buf[] Error!;switch(*(pstr12)){case 1:if(*(pstr13)1){HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET);}else if(*(pstr13) 0){HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET);}break;case 2:if(*(pstr13) 1){HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_SET);}else if(*(pstr13) 0){HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_RESET);}break;default:HAL_UART_Transmit(huart1, buf, 6, 6);break;}}}rxlencnt 0;memset(rxbuf, 0, LEN);
}