【WCH蓝牙系列芯片】-基于CH592开发板—BLE_UART程序中修改蓝牙名字

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

  在BLE_UART中,我们可以借助串口功能, 在蓝牙初始化之后,修改蓝牙的广播名字,这样在做设备产品时,就可以让成千上百的蓝牙设备做到蓝牙名字是唯一的,省去了每次手动修改蓝牙程序,编译下载到板子上,才能显示不同蓝牙名字的步骤。

  在BLE_UART中,在UART_TO_BLE_SEND_EVT事件任务中,在接收串口数据往BLE方向发送数据, 先从UART接收FIFO中读取数据,然后按照串口发送的协议格式,进行解析数据,然后将解析出来的串口数据,发送的蓝牙名字数据,保存到FLASH 中,在保存之前,进行对比原有的FLASH 中的蓝牙名字的数据。如果发送的的蓝牙名字数据与原先保存在FLASH 中的数据一致,就可以直接不保存,退出操作,说明此时的设置蓝牙名字就是设备本身广播的蓝牙名字。但是如果不一致,那就要先擦除FLASH某个地址的数据,然后再将数据写入FLASH中,然后重新重启系统,进行软复位。

  最后还要重置UART到BLE的发送事件计数器

image

            case SEND_TO_BLE_TO_SEND:
            {
                // 检查UART接收数据是否以"set_name:"开头
                // 定义缓冲区存储前9个字符("set_name:"为9个字符)
                char sendData[10] = {0};
                // 从UART接收FIFO中读取9个字节(FIFO的索引通过与运算处理环形缓冲区,保证不越界)
                for (uint8_t i = 0; i<9; i++)
                {
                    sendData[i]  = app_uart_rx_fifo.data[app_uart_rx_fifo.begin+i & app_uart_rx_fifo.size_mask];
                }
                // 如果前9个字符是"set",
                if(strcmp(sendData,"set_name:") == 0)
                {
                    uint8_t buf[200] = {0};   // 定义缓冲区存储UART接收的完整数据(最长200字节)
                    uint16_t len = 0;
                    len = app_uart_rx_fifo.end - app_uart_rx_fifo.begin;  // 计算FIFO中待读取的数据长度(end - begin,环形缓冲区的长度计算)
                    PRINT("data_len:  %d\r\n",len);
                    result = app_drv_fifo_read(&app_uart_rx_fifo, buf, &len);// 从UART FIFO中读取数据到buf,长度为len
                    PRINT("-----data_buf-----:%s\r\n",&buf[9]); //输出"set_name"指令后的内容(跳过"set_name:"9个字符,即从索引9开始)
                    uint8_t eeprom_data[10] = {0};  // 定义缓冲区存储从EEPROM读取的数据(最长50字节)
                    EEPROM_READ( 0,(uint8_t*)eeprom_data, 10 );  // 从EEPROM的0地址开始读取50字节到eeprom_data
                    // 打印EEPROM读取的所有数据(添加部分)
                    PRINT("EEPROM raed data: \r\n");
                    for (uint8_t i = 0; i < 10; i++) {
                        PRINT("0x%02X  ", eeprom_data[i]);
                        // 每10个字节换行,方便查看
                        if ((i + 1) % 10 == 0) {
                            PRINT("\r\n");
                        }
                    }
                    PRINT("\r\n");  // 打印结束后换行
                    // 新增:获取新数据和FLASH中已有数据的内容及长度
                    char* new_data = (char*)&buf[9];               // 新数据("set_name:"后面的内容)
                    char* flash_data = (char*)&eeprom_data[4];      // FLASH中已存数据(原存储位置)
                    uint8_t new_len = strlen(new_data);             // 新数据长度
                    uint8_t flash_len = 4;         // FLASH中已有数据长度
                    PRINT("new data: [%s], len: %d\r\n", new_data, new_len);
                    PRINT("FLASH_data: [%s], len: %d\r\n", flash_data, flash_len);
                    uint8_t data_equal = 0;
                    if (new_len == flash_len)    // 先比较长度
                    {
                        if (memcmp(new_data, flash_data, new_len) == 0)    // 再比较内容
                        {
                            data_equal = 1;                          // 长度和内容均相同
                        }
                    }
                    // 根据比较结果处理
                    if (data_equal)
                    {
                        // 数据相同:不保存,打印提示
                        PRINT("!!!The new data is the same as the data stored in FLASH, so there is no need to save\r\n");
                    }
                    else
                    {
                        // 数据不同:执行保存操作,打印提示
                        PRINT("The new data is different from the data stored in FLASH, start saving...\r\n");
                        // 复制新数据到EEPROM缓冲区
                        strncpy(flash_data, new_data, new_len);
                        // 写入FLASH(先擦除再写入)
                        EEPROM_ERASE(0, 10);
                        EEPROM_WRITE(0, (uint8_t*)eeprom_data, 10);
                        memset(eeprom_data, 0, 10);
                        EEPROM_READ(0, (uint8_t*)eeprom_data, 10); // 验证写入结果
                        PRINT("NEW DATA IS OK\r\n");
                        // 重启系统
                        PFIC_SystemReset();
                    }
                    // 重置UART到BLE的发送事件计数器
                    uart_to_ble_send_evt_cnt = 0;
                    // 跳出"set"指令处理分支
                    break;
                }
            }      

  在扫描应答包中,设置的蓝牙名字是BLE_UART_0000,

image

  在蓝牙从机初始化中,将FLASH中之前存储的蓝牙名字的数据,读取出来,然后将数据根据蓝牙名字在扫描应答包中的数据位置进行修改。在此处的蓝牙名字中,就得从scanRspData[11]进行修改,然后修改后面的“0000”四个数据。然后用GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(advertData), advertData);重新设置一下扫描应答包。

image

 

  如果不想再初始中调用,也可以自己建立一个TMOS任务事件去更新广播包和扫描应答包,然后调用下面的接口函数去更新广播包和烧苗应答包。

  GAP_UpdateAdvertisingData( Peripheral_TaskID,TRUE ,sizeof( advertData ),advertData );//更新广播包

  GAP_UpdateAdvertisingData( Peripheral_TaskID,FALSE ,sizeof( scanRspData ),scanRspData );//更新扫描应答包

  通过串口发送数据,观察现象,默认是BLE_UART_0000

image

  串口发送数据,set_name:8888,此时蓝牙名字也改变

image

 

posted on 2025-08-29 18:46  凡仕  阅读(76)  评论(0)    收藏  举报