TI中文支持网
TI专业的中文技术问题搜集分享网站

TM4C123GH6PZ 在使用UARTCharGet函数的问题

TI的工程师们 请教下

 UARTCharGet函数循环接收时第一次没有阻塞,

if(flag==1)
 { 
   UART1_RX_data[0]=UARTCharGet(UART1_BASE);
  SysCtlDelay(50000);
  
  
  UARTCharPut(UART1_BASE,UART1_RX_data[0]);
  SysCtlDelay(50000);
}
第一次没有阻塞 ,串口调试软件直接显示00  ,后面每次都有阻塞,串口调试软件显示的是发送的数据
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位,所以发送两次才会触发中断了。

赞(0)
未经允许不得转载:TI中文支持网 » TM4C123GH6PZ 在使用UARTCharGet函数的问题
分享到: 更多 (0)