This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
开发中遇到的问题,暂时没能查出原因,求助TI专家。
芯片型号:TM4C123FH6PMI
问题描述:UART1接收上位机发来的数据帧(长度大于16字节),只有前16字节能正确接收,超过16字节的部分不能被接收。波特率:460800
下面是UART1初始化部分代码:
/**********串口1初始化函数**********/ //参数:baud-波特率 //返回:无 //备注:串口1用于与上位机的通信 void USART1_Init(uint32_t baud) { /*开启GPIOC与UART1时钟*/ ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1); /*配置PC4、PC5管脚映射为UART1的RX和TX*/ ROM_GPIOPinConfigure(GPIO_PC4_U1RX); ROM_GPIOPinConfigure(GPIO_PC5_U1TX); /*配置PC4、PC5管脚为串口所需的模式*/ ROM_GPIOPinTypeUART(GPIO_PORTC_BASE,GPIO_PIN_4|GPIO_PIN_5); /*配置UART1的时钟源为内部精确振荡器*/ ROM_UARTClockSourceSet(UART1_BASE,UART_CLOCK_PIOSC); /*使能FIFO*/ ROM_UARTFIFOEnable(UART1_BASE); /*关闭硬件流控*/ UARTFlowControlSet(UART1_BASE,UART_FLOWCONTROL_NONE); /*为串口1提供控制台输入输出函数的支持,串口1时钟频率为16MHz*/ UARTStdioConfig(1,baud,16000000); /*使能UART1*/ ROM_UARTEnable(UART1_BASE); /*如果对串口1使用DMA方式*/ #ifdef SEND_USE_DMA /*设置串口1产生DMA请求的条件,当发送(接收)FIFO中的数据少于(多于)其容量的1/8时产生DMA请求*/ ROM_UARTFIFOLevelSet(UART1_BASE,UART_FIFO_TX1_8,UART_FIFO_RX1_8); /*使能串口1的DMA操作*/ ROM_UARTDMAEnable(UART1_BASE,UART_DMA_TX); #endif UARTprintf("UART1 initilization completed!\n"); }
下面是非中断接收数据帧部分的代码
/*接收帧缓冲区*/ volatile uint8_t received_frame[50]; /**********接收一帧数据并解析函数**********/ //参数:无 //返回:无 //备注: void Receive_Data(void) { uint8_t volatile i,sum = 0,num; /*如果接收到数据,即串口接收FIFO非空*/ if(ROM_UARTCharsAvail(UART1_BASE) == true) { /*帧头*/ received_frame[0] = (uint8_t)UARTCharGet(UART1_BASE); received_frame[1] = (uint8_t)UARTCharGet(UART1_BASE); /*功能字*/ received_frame[2] = (uint8_t)UARTCharGet(UART1_BASE); /*帧长(只包括有效数据部分)*/ received_frame[3] = (uint8_t)UARTCharGet(UART1_BASE); /*总帧长,即该帧的总字节数*/ num = received_frame[3]+5; /*根据帧长接收余下的字节*/ for(i = 4;i<num;i++) received_frame[i] = (uint8_t)UARTCharGet(UART1_BASE); /*如果帧头不符,则不对这一帧进行解析*/ if((received_frame[0] != 0xAA)||(received_frame[1] != 0xAF)) return; /*计算校验和*/ for(i = 0;i<(num-1);i++) sum += received_frame[i]; /*如果校验和不符,则不对这一帧进行解析*/ if(sum != received_frame[num-1]) return;
在线DEBUG观察received_frame数组的内容,发现0-15字节正常,而后面的几个字节却是下一帧的内容,从而导致校验和不正确。请不吝赐教。
不应该呀,你直接把接收到的数据放到数组中,读这些数据,看看怎么会少呢?还有,你得判断你的数据是在DMA传送之前缺失的,还是在DMA传送之后缺失的。官方给的有DMA USART的例程,参考看看。