请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F030串口数据丢失问题

[复制链接]
四季 提问时间:2019-5-23 10:47 /
这两天调试F030的串口,cubemx配置,2400波特率、8、1,HAL库,用(HAL_UART_Receive_IT(&huart1,(uint8_t *)aRxBuffer,1),启动中断,接受1字节,进入回调函数,后续需要在回调中处理帧识别等操作,发现串口中断接受只能收前2字节数据,从第3字节起变为00,很是烦恼
int main(void)
{
xxxxxxx

if(HAL_UART_Receive_IT(&huart1,(uint8_t *)aRxBuffer,1)!=HAL_OK)
  Error_Handler();
  while (1)
  {  

    if(Uart1Ready_R==SET)
    {
       Uart1Ready_R=RESET;
       Txtemp[0]=Rx_count_UART1;
       Rx_count_UART1=0;
       Uart1_Send(Rxbuff, 10);
       memset(&Rxbuff, 0, sizeof(Rxbuff) / sizeof(uint8_t));//缓存清理
    }
}
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if( huart == (&huart1))
{
  UNUSED(huart);
  Rxbuff[Rx_count_UART1]=aRxBuffer[0];
  Rx_count_UART1++;
  if(Rx_count_UART1==10)
  {
   Uart1Ready_R=SET;
  }
  HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1);
}
}




捕获.JPG
收藏 评论5 发布时间:2019-5-23 10:47

举报

5个回答
289466080 回答时间:2019-5-23 16:23:11
在HAL_UART_RxCpltCallback中增加
    __HAL_UART_CLEAR_IDLEFLAG(&huart1);
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
试试看

参考
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  2. {
  3.   if (huart->Instance == USART1)
  4.   {
  5.     uart1_RxBuff[uart1_Rx_Count] = uart1_Rx_Temp;
  6.     HAL_UART_Receive_IT(huart, (uint8_t *)&uart1_Rx_Temp, 1);
  7.     if (++uart1_Rx_Count >= RECEIVELEN)
  8.     {
  9.       uart1_Rx_Count--;
  10.     }
  11.     __HAL_UART_CLEAR_IDLEFLAG(&huart1);
  12.     __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
  13.   }
  14. }
复制代码

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

289466080 回答时间:2019-5-23 16:25:40
串口接收我也调试了好几天,因为发送端经常发送不定长度,把我真的搞晕了。
四季 回答时间:2019-5-23 17:25:34
289466080 发表于 2019-5-23 16:23
在HAL_UART_RxCpltCallback中增加
    __HAL_UART_CLEAR_IDLEFLAG(&huart1);
    __HAL_UART_ENABLE_IT(&hu ...

你调试好了么,加了这两句,还不行,卡机触发关门狗reset了
289466080 回答时间:2019-5-24 08:39:08
sammychen 发表于 2019-5-23 17:25
你调试好了么,加了这两句,还不行,卡机触发关门狗reset了

https://www.stmcu.org.cn/module/forum/thread-620624-1-1.html
參考我这个不定长也可以,但是最大值时要重置,我用的STM32F030F4P6
还有一个比较好的我先整理下

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

四季 回答时间:2019-5-24 08:54:18
本帖最后由 sammychen 于 2019-5-24 08:55 编辑

感谢各位,此问题暂时已经解决,实际上数据已经成功接收了,问题出在发送返回的时候,因为使用中断发送,然后立即清理缓存,此时刚发送2个字节,后面的字节还未发送是就被清理掉了。后续按需要加入帧的检测再测试看看。
       Uart1_Send(Rxbuff, 10);
       memset(&Rxbuff, 0, sizeof(Rxbuff) / sizeof(uint8_t));//缓存清理

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2 总结问题

查看全部评分

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版