串口通讯应用目标:
串口波特率: 115200b/s
串口接收缓存:256 Byte
串口发送缓存:256 Byte
串口助手发送一帧数据,同时串口助手接收返回数据:
发送长度250B,返回250B
发送长度260B,返回4B,说明接收缓存只有256 B
图1 发送长度250
图2发送长度260
代码实战
开发该串口通信模块,只需3个步骤、3部分代码,按照此方法快速上手,此方法好处是串口接收数据不丢数据,接收一整数据帧后再做数据处理,非常适合做交互式通信接口,用户可以直接拷贝代码,放在系统对应位置中即可,这都是笔者发大量时间测试通过的代码,为你节省开发时间。
一、串口初始化配置
system_set_port_pull(GPIO_PA0, GPIO_PULL_UP, true);
system_set_port_mux(GPIO_PORT_A, GPIO_BIT_0, PORTA0_FUNC_UART0_RXD);
system_set_port_mux(GPIO_PORT_A, GPIO_BIT_1, PORTA1_FUNC_UART0_TXD);
uart_init(UART0, 1152);
fr_uart_enableIrq(UART0, Uart_irq_erbfi);
NVIC_EnableIRQ(UART0_IRQn);
二、串口中断处理
void uart0_IRQHandler(void)
{
uint8_t data;
switch (__UART_INT_GET_ID(Uart0))
{
case INT_INDEX_TXE:
{
/* Tx empty interrupt and fifo disable */
Uart0->IER_DLH.IER.PTIME = 0;
Uart0->IER_DLH.IER.ETBEI = 0;
//co_printf("---->INT_INDEX_TXE\r\n");
}
break;
case INT_INDEX_RX:
case INT_INDEX_RX_TOUT:
{
/* Rx ready */
//rx fifo at least have one data
/*while (Uart0->LSR.LSR_BIT.DR)
{
data = Uart0->DATA_DLL.DATA;
//uart_fifo_data_rx(data);
uart_putc_noint_no_wait(UART0, data);
}
*/
while (Uart0->LSR.LSR_BIT.DR)
{
data = Uart0->DATA_DLL.DATA;
//uart_putc_noint_no_wait(UART0, data);
stTxUartBuf.txBuf[stTxUartBuf.size] = data;
stTxUartBuf.size ++;
if (stTxUartBuf.size >= uartRxBufferMAX)
{
stTxUartBuf.size = 0;
}
}
App_uartTimeoutTaskStart();
}break;
case INT_INDEX_LINE:
{
volatile uint32_t line_status = Uart0->LSR.LSR_DWORD;
//co_printf("---->INT_INDEX_LINE [%x]\r\n",line_status);
}break;
default:
break;
}
}
__attribute__((section("ram_code"))) void uart0_isr(void)
{
uart0_IRQHandler();
}
三、串口接收收发接口
/*
* 功能: handle_UartRxHandle
*
* 注解: 串口接收一帧数据处理
*
* 输入: dat:缓存 len:长度
* 输出: 无
*
*/
static void handle_UartRxHandle(uint8_t *dat,uint32_t len)
{
//co_printf("len:%d\r\n",len);
uart_send_len(dat,len);
//UART_to_AT_CMD(dat,len);
}
/*
* 功能: App_uartProcess
*
* 注解: 串口接收一帧数据处理
*
* 输入: 无
* 输出: 无
*
*/
static void App_uartProcess(void *param)
{
handle_UartRxHandle(stTxUartBuf.txBuf,stTxUartBuf.size);
stTxUartBuf.size = 0;
}
/*
* 功能: App_uartHandlerInit
*
* 注解: 串口接收应用初始化
*
* 输入: 无
* 输出: 无
*
*/
static void App_uartHandlerInit(void)
{
os_timer_init(&uart_process_timer, App_uartProcess, NULL);
}
/*
* 功能: App_uartTimeoutTaskStart
*
* 注解: 开始接收并等待串行数据超时
*
* 输入: 无
* 输出: 无
*
*/
void App_uartTimeoutTaskStart(void)
{
os_timer_start(&uart_process_timer, 20, false); //start 10ms anti-shake timer
}
版权声明:内容来源于互联网和用户投稿 如有侵权请联系删除