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

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了,不是应该发送一个字节后直接返回的吗?

xyz549040622:

你没有禁止掉FIFO吧,事实上,这个也禁止不掉。数据的发送和接收都是通过FIFO的,你禁止掉FIFO,数据发送和接收的缓存区在哪呢?

user4619179:

回复 xyz549040622:

这一句不是禁止FIFO了吗?

ROM_UARTFIFODisable(pUART->ui32UARTBase);

如果不是那请问要如何才能实现一个字节一个字节接收?

Maka Luo:

FIFO最小溢出中断是2bytes,建议修改通信协议,每次发送超过2bytes. 

如果需要一个个byte读取,只能你主动去查询FIFO中是否存在数据。

user4619179:

回复 Maka Luo:

那如果发送的数据数是 奇数个的话,最后一个字节虽然收到了但不溢出,用中断接收的话不就没法收到完整的报文了吗?

Maka Luo:

回复 user4619179:

 中断只是一种方式,FIFO中都是可以随时读取,如果接收到数据。

赞(0)
未经允许不得转载:TI中文支持网 » TM4C129如何实现串口一个字节一个字节地接收?
分享到: 更多 (0)