尊敬的技术人员,您好,目前在开发过程中尚存在几个小问题,烦请解答,谢谢。
目前连接的步骤为:扫描 - 建立连接 - 申请2M PHY - PHY申请回调中 - 请求最大MTU - MTU回调中发现服务 - 发现服务回调中发现特征,订阅其中一个notify特征,然后处理另一个可读写特征数据。共有两个特征,一个长度180字节可读写特征,一个2字节notify特征。MTU目前设置为247。
发送大量数据时:写入特征值(共180字节的结构体序列化数据) - 设备端的写入回调被调用 - 处理数据 - 使用另一个notify特征通知手机。
现在存在的问题是:
?1.?我现在使用CH582M与安卓手机建立连接,发送大量数据,在快速发送数据过程中手机会与设备断开连接,设备显示reason 13,为手机主动断开连接,上网搜寻后得知,建立连接后要先请求高优先级,但是实际测试中发现设置优先级对这个情况没有明显改善 ( 读写操作的相关等待延迟已妥善设置 )。
2 在设备端特征被写入的回调函数中,uint8_t* pValue 【有时候】无法直接使用结构体指针反序列化,反序列化指针使用const进行约束,在反序列化之前也会对实际的数据长度 len 进行检查。 反序列化无法使用的表现为主循环停止执行了,因为一般在断开连接后串口会打印出扫描信息,连接成功会也会打印read rssi信息。而在这种情况下,串口没有任何数据输出,此时使用调试器也无法正确连接。已确认此处理代码过程中不含有无限循环等阻止CPU执行的情况,也没有出现内存越界的情况。( 目前只能 tmos_memcpy到另一个缓冲区中处理 )
3. 设备notify特征值的时候,调用的一个库函数似乎使用了动态内存分配,因为是预编译的静态库,所以不容易做出修改,可否有办法改为静态全局缓冲区分配?我尝试过改为静态分配,但是无法成功notify。
4. 在使用BLE的时候,编译出来的固件体积较大,已开启 -Os 优化、移除未使用的输入段、链接时全局优化等选项,但体积仍然较大,不知道是否能够提供静态库的源代码以供精简冗余信息?(无法提供源代码的话请忽略此条) 因为在许多官方C代码中在处理不同情况的时候会使用很多条件与循环,这部分代码对于定制化的功能来说是冗余的。
5. 因MRS的代码索引等功能较为不完善,所以目前我们使用vscode + eide插件进行开发,编译器等组件直接使用MRS下的toolchain目录,但是目前使用WCH-LINKE进行调试的时候仍需使用MRS,因为在vscode中使用cortex-debug插件无法进行调试,但是能在网络上搜索到文章,可以对CH32V20X进行调试,我按照相同的步骤选择各个参数后,无法与目标设备建立连接。因为新版的的cortex-debug插件要求GCC 9以上,所以目前使用0.43版本,不知道是否有相关配置文件提供?
6. 这里借用了官方的OTA升级工具对比吞吐量,发现官方的OTA升级工具吞吐量比目前我们的测试程序高出许多,但是在研究了官方提供的Android Studio工程源代码之后发现与我们使用的方式是一样的,我们目前的工程代码(设备端)是从?Peripheral 例程修改而来的,请参考我上面提到的步骤,帮助分析一下是否有哪些地方存在问题?而且官方的OTA代码在接收到数据时还对 flash 进行了编程,根据官方手册的参数,编程flash速度要慢得多,我们的处理代码仅进行了耗时很短的操作,且在执行此测试时,我们关闭了用户自定义的中断,仅保留必要的中断。
以上是信息描述,非常感谢。