【WCH蓝牙系列芯片】-STM32串口操作CH9141模块透传和AT指令配置

-------------------------------------------------------------------------------------------------------------------------------------

  在很多应用场景中,把CH9141只是作为一个蓝牙串口透传的模式,但是在设备中可能得有一个主MCU通过串口去操作这个CH9141模块。这次以STM32为例,通过STM32的串口与CH9141的芯片模块进行通信,并且还可以通过STM32的串口发送AT指令,操作CH9141的AT的配置信息。

  在蓝牙透传中常见的不定长数据包和高并发突发数据,程序中采用中断+缓冲FIFO的方式来接收数据。

  在接收端,当RX引脚收到一个字节,触发 USART1_IRQHandler 中的 RXNE 中断。在中断服务函数直接将接收带的字节存入 Rx_FIFO.buffer,并向后移动写指针 (write_ptr)。

image

image

  在发送端,直接调用 Serial_SendByte 函数,数据不直接扔给硬件,利用FIFO缓冲区,而是先存入 Tx_FIFO.buffer,然后开启发送寄存器空中断 (USART_IT_TXE)。如果硬件一旦发现发送寄存器为空,就会触发中断,自动从 Tx_FIFO 中提取下一个字节并发送,直到队列为空,关闭中断。

image

  在CH9141模块中,利用CH9141_SendCmd 函数是与CH9141模块进行AT指令交互。根据 CH9141的数据手册中,通过串口发送 AT...\r\n 进入AT配置模式前,总线必须保持空闲。程序在初始化中通过 Delay_ms(600); 强制等待,确保满足CH9141模块要求的 500ms 最小空闲时间。

在CH9141_SendCmd程序中,首先调用 Serial_ClearRx() 强制清空接收 FIFO 的读写指针。确保接下来的字符串匹配不受干扰。通过 Serial_SendString 发送串口指令;进入一个 while 循环,程序不断从 FIFO 中提取新到达的字节存入 rx_buf,最后进行串口应答数据的校验。

image

在主函数中,先对串口进行初始化操作,然后通过CH9141_SendCmd函数发送AT指令,进入串口AT指令配置模式,

发送AT... 进入AT模式

AT+VER 查询当前CH9141芯片版本

AT+NAME? 查询当前CH9141蓝牙名字

AT+NAME=9141-TEST 设置当前CH9141蓝牙名字

AT+RESE 复位CH9141芯片

image

  在AT指令配置完成之后,退出AT指令配置,就直接进入透传模式。由于这个CH9141的MTU受限原因,蓝牙底层会将长包数据拆分为两包或多包(如 发送200个字节数据,会分成131 字节 + 69字节),且空口传输会产生毫秒级的连接间隔延迟。

  程序中在利用 last_len 和 timeout 实现了数据缓冲,使用 Serial_GetRxCount() 检查接收 FIFO,发现大于 0 则触发数据帧重组逻辑。记录当前长度到 last_len;延时 10ms,给蓝牙底层传输留出时间;再次读取最新长度 rx_len

  如果 rx_len != last_len,说明 10ms 内有新数据进来(第二包拆分数据到),继续进入下一个 10ms 等待;直到长度不再增长,认定该次不定长数据包彻底接收完毕。加入 timeout < 20 限制,防止高频的连续数据流导致程序死锁在此循环中。

  全部数据接收完成后,程序利用 for 循环调用 Serial_ReadByte() 将完整数据从环形缓冲区连续取出存入 TempBuffer。然后通过 USART1 (Serial_SendArray) 将数据原路返回给手机端APP,完成一次回传的透传方式。

image

  可以通过串口调试打印来观察整个

image

 

 

 

image

image

 

 

posted on 2026-06-23 09:20  凡仕  阅读(39)  评论(0)    收藏  举报