打印
[开发工具]

HAL库串口接收中断函数的一种使用方法

[复制链接]
1582|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Micachl|  楼主 | 2016-4-18 22:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用过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);                                                   
                                }                 
                        }
                }               
        }
}


沙发
Micachl|  楼主 | 2016-4-18 22:19 | 只看该作者
其中
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;


使用特权

评论回复
板凳
Serge_Ding| | 2016-4-27 17:21 | 只看该作者
我刚发了一个。使用串口DMA的,你可以看看https://bbs.21ic.com/icview-1472850-1-1.html

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

300

帖子

1

粉丝