我用HAL_UART_Receive_IT(&huart2,RxBuffer,10); 这个函数接收串口发来的数据,然后在void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle) 中处理数据并开启下一次中断。 现在经过实际测试是HAL_UART_Receive_IT()函数中第三个接收数据长度的参数如果设置短的话片子容易死掉。接收长度设置长的话,如果一次过来的数据不够数量串口继续在那等着。这两种情况肯定与实际情况不符。 求助一个各位达人,如果做到对方发来多少字节,可以在串口中接收同样的字节数,然后处理。 |
https://www.stmcu.org.cn/module/ ... &fromuid=394920
(出处: 意法半导体STM32/STM8技术社区)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
//UNUSED(huart);
if(huart->Instance == USART1)
{
//串口发送完数据就中断,立马存到缓冲区,中断比存储要快,所以能存完串口的所有数据
//然后发送完后,继续开启中断接收函数
RxBuffer1[RxCounter1++]=RxTemp1;
RxBuffer1[RxCounter1++]=0;
RxCounter1=0;
HAL_UART_Transmit(&huart3,RxBuffer1,strlen(RxBuffer1),100);
HAL_UART_Receive_IT(&huart1,&RxTemp1,1);
}
if(huart->Instance == USART3)
{
RxBuffer3[RxCounter3++]=RxTemp3;
RxBuffer3[RxCounter3++]=0;
RxCounter3=0;
HAL_UART_Transmit(&huart1,RxBuffer3,strlen(RxBuffer3),100);
HAL_UART_Receive_IT(&huart3,&RxTemp3,1);
}
}
学到了
用库函数的时候可以用下面的代码接收数据
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收数据
{
a=USART_ReceiveData(USART2);
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
}
用stm32cubemx 怎么实现同样的功能呢。
hal里面直接有中断函数的处理和状态清除。cubemx生成里面应该有中断函数部分吧。
cubemx里边的中断接收函数只能定长接收,如果不定长只能用dma加串口中断接收好像还不如用库函数来的方便的。
把10改成1,因为你的数据是不定长度的,接收函数写在串口接收的回调函数内,
HAL_UART_Receive_IT(&huart1,&Rx2Buffer,1);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
if(UartHandle->Instance==USART2) //
{
COM2_ATCMDretREC[COM2_REC_POINT] = Rx2Buffer;
COM2_REC_POINT++;
if(COM2_REC_POINT >= COM2_REC_BYTES_MAX) { COM2_REC_POINT = 0; }
}
}
在主程序内每间隔200mS(这个时间间隔不要太小就行了),比较前后两次的COM2_REC_POINT值,如果值不为0,并且两次值是一样的,就可以基本判断为这次接收的数据结束了,否则再等下一个200MS.
这样做你试过吗? 现在我实验的结果是如果中断接收函数的长度改为1 的话,我发送超过一个字节的数据,片子会死掉。
如果发送超过一个字节,片子会死掉,那很可能是设置的问题,HAL库其实已经帮我们考虑了很全面了。
还有提醒一下,如果你的程序有很多警告的话,建议你注意一点,有些警告没关系的,有些警告会有问题的。
我已经养成习惯了,规范语法,基本可以做到一个警告也没有,也可以避免一些陷阱。
一语惊醒我了,我按照教程在发送函数后边判断if(HAL_UART_Transmit_IT(&huart2,(uint8_t*) Uart2Data,1) !=halok) 执行了Error_Handler() 函数,并且出现的这个警告没有处理。导致出现上边的问题。感谢提醒!
现在问题是HAL_UART_Receive_IT(&huart1,&Rx2Buffer,1); 这个函数当我发送三个字节的时候,这个函数只接受第一个字节,后两个字节丢了。
回调函数肯定加了。问题是定长接收一个字节, 我发送三个字节,那后两个字节就丢了。
理解不了你的做法。进串口中断后把Rx2Buffer这个数据保存到数组没有问题。 问题是我发送了三个字节,接收函数只接受一个字节。我把这一个字节保存到数组中了,丢了另外两个。 没有意义啊。