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

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,

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

如果不想再初始中调用,也可以自己建立一个TMOS任务事件去更新广播包和扫描应答包,然后调用下面的接口函数去更新广播包和烧苗应答包。
GAP_UpdateAdvertisingData( Peripheral_TaskID,TRUE ,sizeof( advertData ),advertData );//更新广播包
GAP_UpdateAdvertisingData( Peripheral_TaskID,FALSE ,sizeof( scanRspData ),scanRspData );//更新扫描应答包
通过串口发送数据,观察现象,默认是BLE_UART_0000

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

浙公网安备 33010602011771号