本帖最后由 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[count1++] = ch2;
- HAL_UART_Receive_IT(&huart2,&ch2,1);
- }
- }
- uint8_t UART1FIFO_Get(void)
- {
- uint8_t ret;
- ret = UART1FIFO.Buf[UART1FIFO.Read];
- if (++UART1FIFO.Read >= BUFFERSIZE)
- {
- UART1FIFO.Read = 0;
- }
- return ret;
- }
- void UART1FIFO_Put(uint8_t byte1)
- {
- UART1FIFO.Buf[UART1FIFO.Write] = 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[count++]=temp;
- //判断帧头
- }
- else if(count==1)
- {
- buffer1[count++]=temp;
- //判断真内容
- }
- else if(count==2)
- {
- buffer1[count++]=temp;
- length = temp;
- //判断长度
- }
- else if(count ==3)
- {
- buffer1[count++]=temp;
- command = temp;
- //判断命令
- }
- else
- {
- buffer1[count++]=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[i]=buffer1[i];
- }
- 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同时发送和接收时,但不明所以,请高手指点一二。
|
能否明示问题在哪呢
评分
查看全部评分