ningboyu 发表于 2016-12-26 13:20:32

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

本帖最后由 ningboyu 于 2016-12-26 14:02 编辑

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

}
}
uint8_t UART1FIFO_Get(void)
{
      uint8_t ret;
                ret = UART1FIFO.Buf;

                if (++UART1FIFO.Read >= BUFFERSIZE)
                {
                        UART1FIFO.Read = 0;
                }
                return ret;
}
void UART1FIFO_Put(uint8_t byte1)
{
      UART1FIFO.Buf = byte1;

      if (++UART1FIFO.Write>= BUFFERSIZE)
      {
                UART1FIFO.Write = 0;
      }
}
void UART1FIFO_Init(void)
{
      UART1FIFO.Read = 0;
      UART1FIFO.Write = 0;
}


int main(void)
{

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration----------------------------------------------------------*/

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

/* Configure the system clock */
SystemClock_Config();

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM1_Init();
MX_CAN_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();

/* USER CODE BEGIN 2 */
      
      hcan.pTxMsg = &TxMessage;
      hcan.pRxMsg = &RxMessage;
      
      UART1FIFO_Init();
      UART2FIFO_Init();
      
      memset(UART1FIFO.Buf,0,BUFFERSIZE*sizeof(uint8_t));
      memset(UART2FIFO.Buf,0,DWINBUFFERSIZE*sizeof(uint8_t));

      
      HAL_UART_Receive_IT(&huart1,&ch,1);
      HAL_UART_Receive_IT(&huart2,&ch2,1);

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

                if(UART1FIFO.Read != UART1FIFO.Write)
                {
                        temp=UART1FIFO_Get();
                        if(count ==0)
                        {
                              buffer1=temp;
                              //判断帧头
                        }
                        else if(count==1)
                        {
                              buffer1=temp;
                              //判断真内容

                        }
                        else if(count==2)
                        {
                              buffer1=temp;
                              length = temp;
                              //判断长度
                        }
                        else if(count ==3)
                        {
                              buffer1=temp;
                              command = temp;
                              //判断命令
                        }
                        else
                        {
                              buffer1=temp;
                              if(count >= length)
                              {
                                        while((HAL_UART_GetState(&huart2) != HAL_UART_STATE_READY) && (HAL_UART_GetState                                        (&huart2) != HAL_UART_STATE_BUSY_RX)){};
                                        for(int i=0;i<length;i++)
                                        {
                                        buffer2=buffer1;
                                        }
                                        switch(command)
                                        {
                                                case 0x80:
                                                case 0x81:
                                                case 0x82:
                                                case 0x83:
                                                case 0x84:
                                                      {
                                                      HAL_UART_Transmit_IT(&huart2, buffer2, length);
                                                      break;
                                                      }
                                                case 0x90:
                                                      {
                                                                Send_Data(cantemp);
                                                                break;
                                                      }
                                                case 0x91:
                                                      {
                                                                Send_Ba(cantemp);
                                                                break;
                                                      }
                                                case 0x92:
                                                      {
                                                                SendTime(cantemp);
                                                                break;
                                                      }
                                                default:break;
                                        }
                                        count =0;
                                        length =0;
                                        }
                              }
                        }

}
/* USER CODE END 3 */

其中uart1和uart2做的是同样的处理,中断只有一个进队列操作。但是在测试的过程中总是出现ORE溢出错误,然后uart2就不再发送了。我感觉问题多发于uart1同时发送和接收时,但不明所以,请高手指点一二。

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方式
页: [1]
查看完整版本: 求助关于HAL库UART的问题,总是ORE错误。