用过HAL库的坛友想必对串口接收中断函数
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
中的 参数 uint16_t Size 深恶痛绝,我看到这个函数心里就在想,我又不知道我可能接收到多少数目的字符串,这个参数怎么给,因此通常情况下,我都是用的阻塞接收函数
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
最近想到一种思路(借鉴原子的思路),不仅可以使用串口接收中断函数,还可以通过结尾为 0x0d 0x0a(即回车换行)判断接收结束
每次中断接收一个字符void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart == &huart6)
{
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到0x0d
{
if(cc2541_rx_at_buff[USART_RX_STA & 0x3FFF]!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else
{
USART_RX_STA|=0x8000; //接收完成
}
}
else //还没收到0x0d
{
if(cc2541_rx_at_buff[USART_RX_STA & 0x3FFF]==0x0d)
{
USART_RX_STA|=0x4000;
USART_RX_STA++;
HAL_UART_Receive_IT(&huart6,&cc2541_rx_at_buff[USART_RX_STA & 0x3FFF],1);
}
else
{
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始
HAL_UART_Receive_IT(&huart6,&cc2541_rx_at_buff[USART_RX_STA & 0x3FFF],1);
}
}
}
}
}
其中uint8_t cc2541_rx_at_buff[USART_REC_LEN];
//接收状态
//bit15 接收完成标志
//bit14 接收到0x0d
//bit13 接收到有效字节数目
uint16_t USART_RX_STA=0; //接收状态标记
#define USART_REC_LEN 200 //定义最大接收字节数
HAL_UART_Receive_IT(&huart6,&cc2541_rx_at_buff[0],1);
while( (USART_RX_STA & 0x8000) == 0);
//
自己的代码
//
uint8_t i=0;
for(i=0;i< (USART_RX_STA & 0x3FFF); i++)
cc2541_rx_at_buff[i] = '\0';
USART_RX_STA = 0;
|