最近接触使用了STM32L4系列产品(只支持HAL库),目前其它功能都调试差不多了。就在串口中断接收上有些问题。
希望过来人对操作方式给点指点指示,万分感激!
目前大致流程是这样的:
1、首先串口初始化,部分代码如下:
Huart1.Instance = COM1;
Huart1.Init.BaudRate = 115200;
Huart1.Init.WordLength = UART_WORDLENGTH_8B;
Huart1.Init.StopBits = UART_STOPBITS_1;
Huart1.Init.Parity = UART_PARITY_NONE;
Huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
Huart1.Init.Mode = UART_MODE_TX_RX;
if (HAL_UART_Init(&Huart1) != HAL_OK)
{
Error_Handler();
}
HAL_NVIC_SetPriority(COM1_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(COM1_IRQn);
HAL_UART_Receive_IT(&Huart1,aRxBuffer1,1);
2、中断函数处理代码:
void USART1_IRQHandler(void)
{
HAL_UART_IRQHandler(&Huart1);
}
3、中断回调函数(接收数据、并开启下个接收中断),部分代码:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
uint8_t ret = HAL_OK;
if(huart->Instance == COM1)
{
//Temp = aRxBuffer1[0];
do
{
ret = HAL_UART_Receive_IT(&Huart1,aRxBuffer1,1); //重新使能中断
}while(ret != HAL_OK); //等待接收所有字符
//HAL_UART_Receive_IT(&Huart1,aRxBuffer1,1);
usart1testcnt++;
Temp = aRxBuffer1[0];
//此处把数据装到一个数组DATABUF中;
}
现在的现象是这样的:
1、如果上位机给发送少于10个字节,没有发现会丢数据;
2、如果上位机发送多余10个字节,比如50个字节,就会在10个字节之后又不同程度的丢数,隔那么几个字节丢一个字节,暂未发现连续2个字节丢失;(已经验证与发送时间间隔无关)
3、如果中断每次接收100个字节//HAL_UART_Receive_IT(&Huart1,aRxBuffer1,100); 上位机发送100个字节都能接收完整不会丢失;
有点疑问:
1、为什么前10几个字节不会丢数?库代码正在研究中;
最重要的问题:
就HAL库,到底该如何实现不定长字节接收?望大家指导!各种思路都可以表达!
|