串口波特率:115200b/s
串口接收缓存:256Byte
串口发送缓存:256Byte
串口助手发送一帧数据,同时串口助手接收返回数据:
发送长度250B,返回250B
发送长度260B,返回4B,说明接收缓存只有256B
图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);
二、串口中断处理
voiduart0_IRQHandler(void)
{
uint8_tdata;
switch(__UART_INT_GET_ID(Uart0))
{
caseINT_INDEX_TXE:
{
/*Txemptyinterruptandfifodisable*/
Uart0-IER_=0;
Uart0-IER_=0;
//co_printf("----INT_INDEX_TXE\r\n");
}
break;
caseINT_INDEX_RX:
caseINT_INDEX_RX_TOUT:
{
/*Rxready*/
//rxfifoatleasthaveonedata
/*while(_)
{
data=Uart0-DATA_;
//uart_fifo_data_rx(data);
uart_putc_noint_no_wait(UART0,data);
}
*/
while(_)
{
data=Uart0-DATA_;
//uart_putc_noint_no_wait(UART0,data);
[]=data;
++;
if(=uartRxBufferMAX)
{
=0;
}
}
App_uartTimeoutTaskStart();
}break;
caseINT_INDEX_LINE:
{
volatileuint32_tline_status=_DWORD;
//co_printf("----INT_INDEX_LINE[%x]\r\n",line_status);
}break;
default:
break;
}
}
__attribute__((section("ram_code")))voiduart0_isr(void)
{
uart0_IRQHandler();
}
三、串口接收收发接口
/*
*功能:handle_UartRxHandle
*
*注解:串口接收一帧数据处理
*
*输入:dat:缓存len:长度
*输出:无
*
*/
staticvoidhandle_UartRxHandle(uint8_t*dat,uint32_tlen)
{
//co_printf("len:%d\r\n",len);
uart_s_len(dat,len);
//UART_to_AT_CMD(dat,len);
}
/*
*功能:App_uartProcess
*
*注解:串口接收一帧数据处理
*
*输入:无
*输出:无
*
*/
staticvoidApp_uartProcess(void*param)
{
handle_UartRxHandle(,);
=0;
}
/*
*功能:App_uartHandlerInit
*
*注解:串口接收应用初始化
*
*输入:无
*输出:无
*
*/
staticvoidApp_uartHandlerInit(void)
{
os_timer_init(uart_process_timer,App_uartProcess,NULL);
}
/*
*功能:App_uartTimeoutTaskStart
*
*注解:开始接收并等待串行数据超时
*
*输入:无
*输出:无
*
*/
voidApp_uartTimeoutTaskStart(void)
{
os_timer_start(uart_process_timer,20,false);//start10msanti-shaketimer
}