STM32L051开机串口接收数据出问题
本帖最后由 ldqmoon 于 2018-4-17 22:39 编辑按下面这个方式来写的串口接收程序,中断方式
刚开机的时候,经常接收不到数据, 调试发现只能接收到第一个字节,上位机多发几次才能收到。
网上查了一些资料,说是中断程序太长导致, 可我的这个程序不长啊, 仅仅就是把接收到的数据放到buff中
麻烦大家分析一下
补充一下:这个程序在正常运行后就不会再出问题
#define MAX_RECV_LEN 2048
uint8_t msg_buff = {0};
uint8_t * msg = msg_buff;
static int flag = FALSE;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
uint8_t ret = HAL_OK;
if(UartHandle==(&huart1))
{
msg++;
if( msg == msg_buff + MAX_RECV_LEN)
{
msg = msg_buff;
}
do
{
ret = HAL_UART_Receive_IT(UartHandle,(uint8_t *)msg,1);
}while(ret != HAL_OK);
flag = TRUE;
}
}
main()中
memset(msg_buff, 0, sizeof(msg_buff));
msg = msg_buff;
printf("hello world\r\n");
HAL_UART_Receive_IT(&huart1, (uint8_t *)msg, 1);//启动第一次中断
do{
if(flag==TRUE)
{
// doing something
memset(msg_buff, 0, sizeof(msg_buff));
msg = msg_buff;
(&huart1)->pRxBuffPtr = msg;
flag = FALSE;
}
}while(!exitflag);
检查下初始化代码,是不是引脚问题,标志位问题呢 本帖最后由 wenyangzeng 于 2018-4-18 07:25 编辑
中断函数里用上do{}很不合理。每次中断执行一次
ret = HAL_UART_Receive_IT(UartHandle,(uint8_t *)msg,1);
就应该返回了。
这个中断不是让你一直等到数据全部接收完才返回的。
do while 不好去掉 中断里不要有长时间的循环,这个是好习惯
页:
[1]