求助关于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
程序有问题!!!!!
能否明示问题在哪呢
我记得出现ORE错误是因为上一帧数据未取走下一帧数据就来了,可以尝试2个方向解决问题:1降低波特率,2,改用DMA方式
页:
[1]