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

求助关于HAL库UART的问题,总是ORE错误。

[复制链接]
ningboyu 提问时间:2016-12-26 13:20 /
本帖最后由 ningboyu 于 2016-12-26 14:02 编辑

我做的是一个转发+解析的程序,用103c8uart1接收串口数据,然后分发给uart2和CAN。uart1和uart2都是全双工通信,串口波特率115200,无校验。
测试时只开两个串口global中断。以下相关代码:
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
  2. {
  3. if(UartHandle->Instance == USART1)
  4. {
  5.                 UART1FIFO_Put(ch);
  6.                   HAL_UART_Receive_IT(&huart1,&ch,1);
  7. }
  8. if(UartHandle->Instance == USART2)
  9. {
  10.                 UART2FIFO_Put(ch2);
  11.                 RXBUFF2[count1++] = ch2;
  12.                 HAL_UART_Receive_IT(&huart2,&ch2,1);

  13. }
  14. }
  15. uint8_t UART1FIFO_Get(void)
  16. {
  17.         uint8_t ret;
  18.                 ret = UART1FIFO.Buf[UART1FIFO.Read];

  19.                 if (++UART1FIFO.Read >= BUFFERSIZE)
  20.                 {
  21.                         UART1FIFO.Read = 0;
  22.                 }
  23.                 return ret;
  24. }
  25. void UART1FIFO_Put(uint8_t byte1)
  26. {
  27.         UART1FIFO.Buf[UART1FIFO.Write] = byte1;

  28.         if (++UART1FIFO.Write  >= BUFFERSIZE)
  29.         {
  30.                 UART1FIFO.Write = 0;
  31.         }
  32. }
  33. void UART1FIFO_Init(void)
  34. {
  35.         UART1FIFO.Read = 0;
  36.         UART1FIFO.Write = 0;
  37. }


  38. int main(void)
  39. {

  40.   /* USER CODE BEGIN 1 */

  41.   /* USER CODE END 1 */

  42.   /* MCU Configuration----------------------------------------------------------*/

  43.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  44.   HAL_Init();

  45.   /* Configure the system clock */
  46.   SystemClock_Config();

  47.   /* Initialize all configured peripherals */
  48.   MX_GPIO_Init();
  49.   MX_TIM1_Init();
  50.   MX_CAN_Init();
  51.   MX_USART1_UART_Init();
  52.   MX_USART2_UART_Init();

  53.   /* USER CODE BEGIN 2 */
  54.         
  55.         hcan.pTxMsg = &TxMessage;
  56.         hcan.pRxMsg = &RxMessage;
  57.         
  58.         UART1FIFO_Init();
  59.         UART2FIFO_Init();
  60.         
  61.         memset(UART1FIFO.Buf,0,BUFFERSIZE*sizeof(uint8_t));
  62.         memset(UART2FIFO.Buf,0,DWINBUFFERSIZE*sizeof(uint8_t));

  63.         
  64.         HAL_UART_Receive_IT(&huart1,&ch,1);
  65.         HAL_UART_Receive_IT(&huart2,&ch2,1);

  66.   /* USER CODE END 2 */

  67.   /* Infinite loop */
  68.   /* USER CODE BEGIN WHILE */
  69.   while (1)
  70.   {
  71.   /* USER CODE END WHILE */

  72.   /* USER CODE BEGIN 3 */

  73.                 if(UART1FIFO.Read != UART1FIFO.Write)
  74.                 {
  75.                         temp=UART1FIFO_Get();
  76.                         if(count ==0)
  77.                         {
  78.                                 buffer1[count++]=temp;
  79.                                 //判断帧头
  80.                         }
  81.                         else if(count==1)
  82.                         {
  83.                                 buffer1[count++]=temp;
  84.                                 //判断真内容

  85.                         }
  86.                         else if(count==2)
  87.                         {
  88.                                 buffer1[count++]=temp;
  89.                                 length = temp;
  90.                                 //判断长度
  91.                         }
  92.                         else if(count ==3)
  93.                         {
  94.                                 buffer1[count++]=temp;
  95.                                 command = temp;
  96.                                 //判断命令
  97.                         }
  98.                         else
  99.                         {
  100.                                 buffer1[count++]=temp;
  101.                                 if(count >= length)
  102.                                 {
  103.                                         while((HAL_UART_GetState(&huart2) != HAL_UART_STATE_READY) && (HAL_UART_GetState                                        (&huart2) != HAL_UART_STATE_BUSY_RX)){};
  104.                                         for(int i=0;i<length;i++)
  105.                                         {
  106.                                         buffer2[i]=buffer1[i];
  107.                                         }
  108.                                         switch(command)
  109.                                         {
  110.                                                 case 0x80:
  111.                                                 case 0x81:
  112.                                                 case 0x82:
  113.                                                 case 0x83:
  114.                                                 case 0x84:
  115.                                                         {
  116.                                                         HAL_UART_Transmit_IT(&huart2, buffer2, length);
  117.                                                         break;
  118.                                                         }
  119.                                                 case 0x90:
  120.                                                         {
  121.                                                                 Send_Data(cantemp);
  122.                                                                 break;
  123.                                                         }
  124.                                                 case 0x91:
  125.                                                         {
  126.                                                                 Send_Ba(cantemp);
  127.                                                                 break;
  128.                                                         }
  129.                                                 case 0x92:
  130.                                                         {
  131.                                                                 SendTime(cantemp);
  132.                                                                 break;
  133.                                                         }
  134.                                                 default:break;
  135.                                         }
  136.                                         count =0;
  137.                                         length =0;
  138.                                         }
  139.                                 }
  140.                         }

  141.   }
  142.   /* USER CODE END 3 */

复制代码
其中uart1和uart2做的是同样的处理,中断只有一个进队列操作。但是在测试的过程中总是出现ORE溢出错误,然后uart2就不再发送了。我感觉问题多发于uart1同时发送和接收时,但不明所以,请高手指点一二。
收藏 1 评论3 发布时间:2016-12-26 13:20

举报

3个回答
andypanfan 回答时间:2016-12-27 09:06:14
程序  有问题!!!!!
ningboyu 回答时间:2016-12-27 13:16:15
andypanfan 发表于 2016-12-27 09:06
程序  有问题!!!!!

能否明示问题在哪呢
海迹天涯 回答时间:2016-12-30 15:14:12
我记得出现ORE错误是因为上一帧数据未取走下一帧数据就来了,可以尝试2个方向解决问题:1降低波特率,2,改用DMA方式

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版