国产BLE芯片横空出世盘它势在必行串口通讯应用
串口通讯应用目标:
串口波特率:115200bs
串口接收缓存:256Byte
串口发送缓存:256Byte
串口助手发送一帧数据,同时串口助手接收返回数据:
发送长度250B,返回250B
发送长度260B,返回4B,说明接收缓存只有256B
图1发送长度250
图2发送长度260代码实战
开发该串口通信模块,只需3个步骤、3部分代码,按照此方法快速上手,此方法好处是串口接收数据不丢数据,接收一整数据帧后再做数据处理,非常适合做交互式通信接口,用户可以直接拷贝代码,放在系统对应位置中即可,这都是笔者发大量时间测试通过的代码,为你节省开发时间。
一、串口初始化配置
systemsetportpull(GPIOPA0,GPIOPULLUP,true);
systemsetportmux(GPIOPORTA,GPIOBIT0,PORTA0FUNCUART0RXD);
systemsetportmux(GPIOPORTA,GPIOBIT1,PORTA1FUNCUART0TXD);
uartinit(UART0,1152);
fruartenableIrq(UART0,Uartirqerbfi);
NVICEnableIRQ(UART0IRQn);
二、串口中断处理
voiduart0IRQHandler(void)
{
uint8tdata;
switch(UARTINTGETID(Uart0))
{
caseINTINDEXTXE:
{
Txemptyinterruptandfifodisable
Uart0IERDLH。IER。PTIME0;
Uart0IERDLH。IER。ETBEI0;
coprintf(INTINDEXTXEr);
}
break;
caseINTINDEXRX:
caseINTINDEXRXTOUT:
{
Rxready
rxfifoatleasthaveonedata
while(Uart0LSR。LSRBIT。DR)
{
dataUart0DATADLL。DATA;
uartfifodatarx(data);
uartputcnointnowait(UART0,data);
}
while(Uart0LSR。LSRBIT。DR)
{
dataUart0DATADLL。DATA;
uartputcnointnowait(UART0,data);
stTxUartBuf。txBuf〔stTxUartBuf。size〕data;
stTxUartBuf。size;
if(stTxUartBuf。sizeuartRxBufferMAX)
{
stTxUartBuf。size0;
}
}
AppuartTimeoutTaskStart();
}break;
caseINTINDEXLINE:
{
volatileuint32tlinestatusUart0LSR。LSRDWORD;
coprintf(INTINDEXLINE〔x〕r,linestatus);
}break;
default:
break;
}
}
attribute((section(ramcode)))voiduart0isr(void)
{
uart0IRQHandler();
}
三、串口接收收发接口
功能:handleUartRxHandle
注解:串口接收一帧数据处理
输入:dat:缓存len:长度
输出:无
staticvoidhandleUartRxHandle(uint8tdat,uint32tlen)
{
coprintf(len:dr,len);
uartsendlen(dat,len);
UARTtoATCMD(dat,len);
}
功能:AppuartProcess
注解:串口接收一帧数据处理
输入:无
输出:无
staticvoidAppuartProcess(voidparam)
{
handleUartRxHandle(stTxUartBuf。txBuf,stTxUartBuf。size);
stTxUartBuf。size0;
}
功能:AppuartHandlerInit
注解:串口接收应用初始化
输入:无
输出:无
staticvoidAppuartHandlerInit(void)
{
ostimerinit(uartprocesstimer,AppuartProcess,NULL);
}
功能:AppuartTimeoutTaskStart
注解:开始接收并等待串行数据超时
输入:无
输出:无
voidAppuartTimeoutTaskStart(void)
{
ostimerstart(uartprocesstimer,20,false);start10msantishaketimer
}