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.

TM4C129如何实现串口一个字节一个字节地接收?

初始化程序如下:

#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>

#include "inc/hw_gpio.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"
#include "driverlib/sysctl.h"

#include "driverlib/uart.h"


#include "user_uart.h"

sUARTInfo stU0,stU1,stU2;//定义串口0 1 2 结构体

static const uint32_t g_ui32UARTBase[3] =
{
UART0_BASE, UART1_BASE, UART2_BASE
};


void OneUART_Init(sUARTInfo *pUART)
{

switch(pUART->ui32PortNum)
{
case 0: ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//串口0
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
pUART->ui32UARTBase=g_ui32UARTBase[pUART->ui32PortNum];
break;

case 1: ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); //串口1
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
ROM_GPIOPinConfigure(GPIO_PB0_U1RX);
ROM_GPIOPinConfigure(GPIO_PB1_U1TX);
ROM_GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);
pUART->ui32UARTBase=g_ui32UARTBase[pUART->ui32PortNum];
break;

case 2: ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); //串口2
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);
ROM_GPIOPinConfigure(GPIO_PA6_U2RX);
ROM_GPIOPinConfigure(GPIO_PA7_U2TX);
ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_6 | GPIO_PIN_7);
pUART->ui32UARTBase=g_ui32UARTBase[pUART->ui32PortNum];
break;

default: return;

}
ROM_UARTConfigSetExpClk(pUART->ui32UARTBase, 120000000, pUART->ui32Baud,
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));

ROM_UARTFIFOLevelSet(pUART->ui32UARTBase, UART_FIFO_TX1_8, UART_FIFO_TX1_8);//如果这里不设置那就发送8个字节才会产生中断了
ROM_UARTFIFODisable(pUART->ui32UARTBase);

ROM_IntMasterEnable();
UARTIntRegister(pUART->ui32UARTBase, pUART->pfnIntHandler);

MAP_UARTEnable(pUART->ui32UARTBase);
ROM_UARTIntEnable(pUART->ui32UARTBase, UART_INT_RX);

UARTCharPut(pUART->ui32UARTBase,'1');//发送测试
}


void U0_pfnIntHandler(void)
{

ROM_UARTIntClear(stU0.ui32UARTBase, ROM_UARTIntStatus(stU0.ui32UARTBase, true));

while(UARTCharsAvail(stU0.ui32UARTBase))//如果串口有数据
{
stU0.Buff[stU0.iRecv]=UARTCharGet(stU0.ui32UARTBase);
UARTCharPut(UART0_BASE,stU0.Buff[stU0.iRecv]);
stU0.iRecv++;
if(stU0.iRecv>=UART_LEN)
stU0.iRecv=0;
}
}

void U1_pfnIntHandler(void)
{
ROM_UARTIntClear(stU1.ui32UARTBase, ROM_UARTIntStatus(stU1.ui32UARTBase, true));

while(UARTCharsAvail(stU1.ui32UARTBase))//如果串口有数据
{
stU1.Buff[stU1.iRecv]=UARTCharGet(stU1.ui32UARTBase);
UARTCharPut(UART1_BASE,stU1.Buff[stU1.iRecv]);
stU1.iRecv++;
if(stU1.iRecv>=UART_LEN)
stU1.iRecv=0;
}
}

void U2_pfnIntHandler(void)
{
ROM_UARTIntClear(stU2.ui32UARTBase, ROM_UARTIntStatus(stU2.ui32UARTBase, true));

while(UARTCharsAvail(stU2.ui32UARTBase))//如果串口有数据
{
stU0.Buff[stU2.iRecv]=UARTCharGet(stU2.ui32UARTBase);
UARTCharPut(UART2_BASE,stU0.Buff[stU2.iRecv]);
stU2.iRecv++;
if(stU2.iRecv>=UART_LEN)
stU2.iRecv=0;
}
}

void AllUART_Init(void)
{

stU0.ui32PortNum=0;
stU0.ui32Baud=9600;
stU0.pfnIntHandler=U0_pfnIntHandler;
OneUART_Init(&stU0);

stU1.ui32PortNum=1;
stU1.ui32Baud=9600;
stU1.pfnIntHandler=U1_pfnIntHandler;
OneUART_Init(&stU1);

stU2.ui32PortNum=2;
stU2.ui32Baud=9600;
stU2.pfnIntHandler=U2_pfnIntHandler;
OneUART_Init(&stU2);

}

我通过上位机一个字节一个字节发送,发现需要发送两个字节后板子才会往上位机返回刚才发送的两个字节数据,那就说明FIFO是收到两个字节后才产生中断的,可是我明明已经禁用FIFO了,不是应该发送一个字节后直接返回的吗?