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

求助关于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扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版