由浅入深,蓝牙4.0BLE协议栈开发攻略大全(4) - 图文 联系客服

发布时间 : 星期二 文章由浅入深,蓝牙4.0BLE协议栈开发攻略大全(4) - 图文更新完毕开始阅读785f4f696c85ec3a87c2c5d6

但是我们发现LCD上的显示和我们预期的不一样,LCD上只显示了6789,前面的数据并没有显示,这是怎么一回事呢?进行单步调试可以发现,我们发送一次数据,回调函数被回调了两次,第一次回调只接受到了012345,第二次回调接收到了6789,而在LCD上的显示第二次覆盖了第一次的显示,所以我们会看到这种现象,解决的办法,我们需要定义一个数据帧的时间间隔,当接收数据的间隔超过了此间隔就认为接收结束。

下面我们改写接收处理,我们在接收到数据后开启定时器,定时5ms这样,当接收间隔大于5ms后,我们就可以在定时事件中处理串口接收到的数据。 static void SerialCb( uint8 port, uint8 events ) {

if((events & HAL_UART_TX_EMPTY)||( events & HAL_UART_TX_FULL )) // 发送区满或者空 { return; }

uint16 usRxBufLen = Hal_UART_RxBufLen(HAL_UART_PORT_0); // 读取接收据量

if(usRxBufLen) {

usRxBufLen = MIN(128,usRxBufLen);

uint16 readLen = HalUARTRead(HAL_UART_PORT_0, &SerialRxBuf[RxIndex], usRxBufLen); // 读取数据到缓冲区 RxIndex += readLen; readLen %= 128;

osal_start_timerEx(simpleBLEPeripheral_TaskID, UART_EVENT, 5); // 启动定时器 } }

事件处理代码:

if ( events & UART_EVENT ) {

HalLcdWriteString( (char*)SerialRxBuf, HAL_LCD_LINE_6 ); // 在第5行显示启动信息

HalUARTWrite(HAL_UART_PORT_0, SerialRxBuf, osal_strlen(SerialRxBuf)); osal_memset(SerialRxBuf, 0, 128); return (events ^ UART_EVENT); }

经过这样的处理后,可以发现我们刚刚的问题已经解决了。

到这里串口已经可以正常使用了,为了更加方便的使用串口,我在这里添加一个函数实现标准C中printf,这样更有利于我们输出。 int SerialPrintf(const char*fmt, 。。。) {

uint32 ulLen; va_list ap;

char *pBuf = (char*)osal_mem_alloc(PRINT_BUF_LEN); // 开辟缓冲区 va_start(ap, fmt);

ulLen = vsprintf(pBuf, fmt, ap); // 用虚拟打印函数实现 va_end(ap);