TI的工程师们 请教下
UARTCharGet函数循环接收时第一次没有阻塞,
{
SysCtlDelay(50000);
UARTCharPut(UART1_BASE,UART1_RX_data[0]);
SysCtlDelay(50000);
Maka Luo:
//*****************************************************************************
////! Waits for a character from the specified port.//!//! \param ui32Base is the base address of the UART port.//!//! This function gets a character from the receive FIFO for the specified//! port. If there are no characters available, this function waits until a//! character is received before returning.//!//! \return Returns the character read from the specified port, cast as a//! \e int32_t.////*****************************************************************************int32_tUARTCharGet(uint32_t ui32Base){ // // Check the arguments. // ASSERT(_UARTBaseValid(ui32Base));
// // Wait until a char is available. // while(HWREG(ui32Base + UART_O_FR) & UART_FR_RXFE) { }
// // Now get the char. // return(HWREG(ui32Base + UART_O_DR));}
注意标注红色部分,其可能没有获取字符,停留在此等待。
xyz549040622:
在规定的时间内,没有收到数据,就会阻塞,这属于你程序的问题。建议你用接收中断,判断接收到字符,然后发送出去。或者循环判断接收到字符后才发送。
zhagnxw:
回复 xyz549040622:
用了接收中断 但是每次上电只能进一次中断,后面发数据就进不去了
void UART1IntHandler(void) { unsigned char Temp[8],i; uint32_t ui32Status; GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_0,GPIO_PIN_0);
ui32Status = UARTIntStatus(UART1_BASE, true);
UARTIntClear(UART1_BASE, ui32Status); while(!UARTCharsAvail(UART1_BASE)) GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_1,0);//485接收使能 for(i=0;i<8;i++) { Temp[i]= UARTCharGet(UART1_BASE); } while(!UARTCharsAvail(UART1_BASE)) GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_1,GPIO_PIN_1);//485发送使能 for(i=0;i<8;i++) { UARTCharPut(UART1_BASE,Temp[i]); } GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_0,0);
}
zhagnxw:
回复 Maka Luo:
直接用串口可以了 ,后来改成用485和中断接收的模式 每次上点只能进一次中断
用了接收中断 但是每次上电只能进一次中断,后面发数据就进不去了
void UART1IntHandler(void) { unsigned char Temp[8],i; uint32_t ui32Status; GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_0,GPIO_PIN_0);
ui32Status = UARTIntStatus(UART1_BASE, true);
UARTIntClear(UART1_BASE, ui32Status); while(!UARTCharsAvail(UART1_BASE)) GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_1,0);//485接收使能 for(i=0;i<8;i++) { Temp[i]= UARTCharGet(UART1_BASE); } while(!UARTCharsAvail(UART1_BASE)) GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_1,GPIO_PIN_1);//485发送使能 for(i=0;i<8;i++) { UARTCharPut(UART1_BASE,Temp[i]); } GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_0,0);
}
zhagnxw:
回复 xyz549040622:
你好 !
再请教你一个问题,TM4C123 为什么串口软件一次发8位数据的时候,才能收到串口传回的正确数据,不足8位的时候只能接收到部分数据
已将FIFO disable 了
xyz549040622:
回复 zhagnxw:
串口只能一次发送8位数据,一个字节就是8位的,你如何传少于8位的数据呢,不可能的吧?
zhagnxw:
回复 xyz549040622:
不好意思 ,我说的是要一次发送16 字节 少于16字节时要发两次才能触发接收中断
xyz549040622:
回复 zhagnxw:
你把FIFO的深度改成8位试试,现在应该是16位,所以发送两次才会触发中断了。