Re: 蓝牙mesh通讯异常
1、网关和mesh设备没有连接,都是通过广播传输数据,蓝牙网关下最多可以有128个蓝牙设备。
2、设备可以订阅群组地址,一个群组地址可以被很多设备订阅,没有限制。
3、都是加密传输的。
1、网关和mesh设备没有连接,都是通过广播传输数据,蓝牙网关下最多可以有128个蓝牙设备。
2、设备可以订阅群组地址,一个群组地址可以被很多设备订阅,没有限制。
3、都是加密传输的。
kangxi 2023年 Jul 12日 14:011、网关和mesh设备没有连接,都是通过广播传输数据,蓝牙网关下最多可以有128个蓝牙设备。
2、设备可以订阅群组地址,一个群组地址可以被很多设备订阅,没有限制。
3、都是加密传输的。
还有一个问题,调用ADC接口,采集电压,发现电压跳动很大,如下所示。
1、ADC配置如下,
2、调用函数采集ADC
3、采集1V的电压,数据打印如下,
这电压误差太大了,有20mv左右的误差,要把误差减小,应该怎么解决,谢谢
泰凌原厂给出的是50mV以内
还有一个问题,
1、目前是打算用一个管脚对红外接收头进行解码,要用到IO口的电平中断(红外接收解码是微秒级的),按照你之前说的,频繁的硬件中断会导致蓝牙断连,那么现在是打算连续开关3次进入设置参数模式,这个模式下,不进行蓝牙通信,只处理红外接收解码工作并保存参数,那“要实现不进行蓝牙通信”,应该调用哪些函数进行处理?
2、对于IO口电平中断,这里有几个库函数可以调用初始化IO口电平中断
但是,进入中断后的处理函数在哪里处理?
以上,谢谢
如果不是很频繁处理红外的话,可以参考以下代码:
Code: Select all
#define INFRA_RED_TIMEOUT 30000 //30MS
#define CALCULATE_MANY_TICKS_IS_1US(time) time*16
#pragma pack(1)
typedef struct {
UINT8_T data[4];
}APP_INFRA_RED_T;
#pragma pack()
STATIC UINT8_T infra_red_pin;
STATIC UINT8_T app_infra_data_get_flag = FALSE;
STATIC APP_INFRA_RED_T infra_red_data;
STATIC OPERATE_RET infra_red_read_bit(UINT32_T tick)
{
OPERATE_RET bit_data = OPRT_COM_ERROR; //二进制位计数标志
if((tick >= CALCULATE_MANY_TICKS_IS_1US(1000))&&(tick <= CALCULATE_MANY_TICKS_IS_1US(1500))){ // bit0 :1.12ms
bit_data = 0;
}else if((tick >= CALCULATE_MANY_TICKS_IS_1US(2000))&&(tick <= CALCULATE_MANY_TICKS_IS_1US(2650))){ //bit1 : 2.25ms
bit_data = 1;
}
return bit_data;
}
STATIC OPERATE_RET infra_red_read_byte(UINT8_T *read_data, UINT32_T tick)
{
STATIC UINT8_T bit_cnt = 0; //二进制位计数标志
STATIC UINT8_T result_byte = 0;
if(read_data == NULL){ //clear
bit_cnt = 0;
result_byte = 0;
return OPRT_COM_ERROR;
}
OPERATE_RET bit_data = infra_red_read_bit(tick);
if(bit_data == OPRT_COM_ERROR){
bit_cnt = 0;
result_byte = 0;
return OPRT_COM_ERROR;
}
result_byte = result_byte | (bit_data << (7-bit_cnt));
bit_cnt++;
if(bit_cnt > 7){
bit_cnt = 0;
*read_data = result_byte;
result_byte = 0;
return OPRT_OK;
}else{
return OPRT_RECV_DA_NOT_ENOUGH;
}
}
STATIC OPERATE_RET infra_red_read_bytes(UINT8_T read_num, UINT8_T *read_data, UINT32_T tick)
{
OPERATE_RET ret;
STATIC UINT8_T byte_cnt = 0;
if(read_data == NULL){ //clear
byte_cnt = 0;
infra_red_read_byte(NULL, NULL);
return OPRT_COM_ERROR;
}
ret = infra_red_read_byte(read_data+byte_cnt, tick);
if(OPRT_COM_ERROR == ret){
byte_cnt = 0;
return OPRT_COM_ERROR;
}else if(OPRT_OK == ret){
if(++byte_cnt >= read_num){
byte_cnt = 0;
return OPRT_OK;
}
}
return OPRT_RECV_DA_NOT_ENOUGH;
}
STATIC OPERATE_RET infra_red_read_preamble_code(UINT32_T tick)
{
if((tick >= CALCULATE_MANY_TICKS_IS_1US(13000)) && (tick <= CALCULATE_MANY_TICKS_IS_1US(14000))){//Detection start mark13500+-500
return OPRT_OK;
}
return OPRT_COM_ERROR;
}
STATIC VOID falling_edge_trigger_event(VOID_T)
{
OPERATE_RET ret;
STATIC UINT32_T old_tick = 0;
STATIC UINT32_T new_tick = 0;
STATIC UINT32_T red_tick = 0;
STATIC UINT8_T start_collect_flag = FALSE;
STATIC APP_INFRA_RED_T infra_red_temp;
new_tick = tal_system_get_tick_count();//16MHz
red_tick = (UINT32_T)(new_tick - old_tick);
old_tick = new_tick;
if(red_tick > (CALCULATE_MANY_TICKS_IS_1US(INFRA_RED_TIMEOUT))){
start_collect_flag = FALSE;
return;
}
if(start_collect_flag == TRUE){
ret = infra_red_read_bytes(SIZEOF(APP_INFRA_RED_T), (UINT8_T *)&infra_red_temp, red_tick);
if(ret == OPRT_OK){
if(app_infra_data_get_flag != TRUE){
memcpy((UINT8_T *)&infra_red_data, (UINT8_T *)&infra_red_temp, SIZEOF(APP_INFRA_RED_T));
app_infra_data_get_flag = TRUE;
}
}else if(ret == OPRT_COM_ERROR){
start_collect_flag = FALSE; //error
return;
}
}else{
if(infra_red_read_preamble_code(red_tick) == OPRT_OK){
start_collect_flag = TRUE; //start mark
memset((UINT8_T *)&infra_red_temp, 0, SIZEOF(APP_INFRA_RED_T));
infra_red_read_bytes(NULL, NULL, NULL);
}
}
}
VOID app_infra_red_run(VOID_T)//run in loop
{
if(app_infra_data_get_flag == TRUE){
app_infra_data_get_flag = FALSE;
}
}
VOID app_infra_red_init(VOID_T)
{
infra_red_pin = TUYA_GPIO_NUM_31;//pd7
TUYA_GPIO_IRQ_T infra_gpio_cfg;
infra_gpio_cfg.mode = TUYA_GPIO_IRQ_FALL;
infra_gpio_cfg.cb = &falling_edge_trigger_event;
infra_gpio_cfg.arg = NULL;
tal_gpio_irq_init(infra_red_pin, &infra_gpio_cfg);
}
kangxi 2023年 Jul 18日 20:29如果不是很频繁处理红外的话,可以参考以下代码:
Code: Select all
#define INFRA_RED_TIMEOUT 30000 //30MS #define CALCULATE_MANY_TICKS_IS_1US(time) time*16 #pragma pack(1) typedef struct { UINT8_T data[4]; }APP_INFRA_RED_T; #pragma pack() STATIC UINT8_T infra_red_pin; STATIC UINT8_T app_infra_data_get_flag = FALSE; STATIC APP_INFRA_RED_T infra_red_data; STATIC OPERATE_RET infra_red_read_bit(UINT32_T tick) { OPERATE_RET bit_data = OPRT_COM_ERROR; //二进制位计数标志 if((tick >= CALCULATE_MANY_TICKS_IS_1US(1000))&&(tick <= CALCULATE_MANY_TICKS_IS_1US(1500))){ // bit0 :1.12ms bit_data = 0; }else if((tick >= CALCULATE_MANY_TICKS_IS_1US(2000))&&(tick <= CALCULATE_MANY_TICKS_IS_1US(2650))){ //bit1 : 2.25ms bit_data = 1; } return bit_data; } STATIC OPERATE_RET infra_red_read_byte(UINT8_T *read_data, UINT32_T tick) { STATIC UINT8_T bit_cnt = 0; //二进制位计数标志 STATIC UINT8_T result_byte = 0; if(read_data == NULL){ //clear bit_cnt = 0; result_byte = 0; return OPRT_COM_ERROR; } OPERATE_RET bit_data = infra_red_read_bit(tick); if(bit_data == OPRT_COM_ERROR){ bit_cnt = 0; result_byte = 0; return OPRT_COM_ERROR; } result_byte = result_byte | (bit_data << (7-bit_cnt)); bit_cnt++; if(bit_cnt > 7){ bit_cnt = 0; *read_data = result_byte; result_byte = 0; return OPRT_OK; }else{ return OPRT_RECV_DA_NOT_ENOUGH; } } STATIC OPERATE_RET infra_red_read_bytes(UINT8_T read_num, UINT8_T *read_data, UINT32_T tick) { OPERATE_RET ret; STATIC UINT8_T byte_cnt = 0; if(read_data == NULL){ //clear byte_cnt = 0; infra_red_read_byte(NULL, NULL); return OPRT_COM_ERROR; } ret = infra_red_read_byte(read_data+byte_cnt, tick); if(OPRT_COM_ERROR == ret){ byte_cnt = 0; return OPRT_COM_ERROR; }else if(OPRT_OK == ret){ if(++byte_cnt >= read_num){ byte_cnt = 0; return OPRT_OK; } } return OPRT_RECV_DA_NOT_ENOUGH; } STATIC OPERATE_RET infra_red_read_preamble_code(UINT32_T tick) { if((tick >= CALCULATE_MANY_TICKS_IS_1US(13000)) && (tick <= CALCULATE_MANY_TICKS_IS_1US(14000))){//Detection start mark13500+-500 return OPRT_OK; } return OPRT_COM_ERROR; } STATIC VOID falling_edge_trigger_event(VOID_T) { OPERATE_RET ret; STATIC UINT32_T old_tick = 0; STATIC UINT32_T new_tick = 0; STATIC UINT32_T red_tick = 0; STATIC UINT8_T start_collect_flag = FALSE; STATIC APP_INFRA_RED_T infra_red_temp; new_tick = tal_system_get_tick_count();//16MHz red_tick = (UINT32_T)(new_tick - old_tick); old_tick = new_tick; if(red_tick > (CALCULATE_MANY_TICKS_IS_1US(INFRA_RED_TIMEOUT))){ start_collect_flag = FALSE; return; } if(start_collect_flag == TRUE){ ret = infra_red_read_bytes(SIZEOF(APP_INFRA_RED_T), (UINT8_T *)&infra_red_temp, red_tick); if(ret == OPRT_OK){ if(app_infra_data_get_flag != TRUE){ memcpy((UINT8_T *)&infra_red_data, (UINT8_T *)&infra_red_temp, SIZEOF(APP_INFRA_RED_T)); app_infra_data_get_flag = TRUE; } }else if(ret == OPRT_COM_ERROR){ start_collect_flag = FALSE; //error return; } }else{ if(infra_red_read_preamble_code(red_tick) == OPRT_OK){ start_collect_flag = TRUE; //start mark memset((UINT8_T *)&infra_red_temp, 0, SIZEOF(APP_INFRA_RED_T)); infra_red_read_bytes(NULL, NULL, NULL); } } } VOID app_infra_red_run(VOID_T)//run in loop { if(app_infra_data_get_flag == TRUE){ app_infra_data_get_flag = FALSE; } } VOID app_infra_red_init(VOID_T) { infra_red_pin = TUYA_GPIO_NUM_31;//pd7 TUYA_GPIO_IRQ_T infra_gpio_cfg; infra_gpio_cfg.mode = TUYA_GPIO_IRQ_FALL; infra_gpio_cfg.cb = &falling_edge_trigger_event; infra_gpio_cfg.arg = NULL; tal_gpio_irq_init(infra_red_pin, &infra_gpio_cfg); }
红外遥控没问题了,还有一个问题,现在是想蓝牙模块不连接手机APP,然后通过红外遥控器发送指令实现本地mesh组网,应该调用哪些函数实现?整个流程是怎么样的?
必须配网才能组网,配网必须用app或者网关。
liuwf 2023年 Jul 4日 20:521、用的产品开发包
64d20b56d070e4bed5c95ebc65d6fb4.png2、进行mesh通讯时,log打印信息如下
1688475092225.png麻烦帮忙看看
在线升级,网页平台推送升级固件,设备正常升级后重启,但是APP上显示升级失败,我测试设备功能,实际上是升级完成的。APP显示失败的原因是什么?程序用到的功能主要是,1ms软件定时到了,采集ADC数据并处理,麻烦帮忙看看,谢谢。
设备升级成功但APP显示失败,一般是版本校验错导致,可以看下升级固件的版本。
你说的版本校验是校验版本号吗?升级固件的版本号是最新的,比如说原来的版本号是1.0.3,更改了程序,生成了新的固件1.0.4,上传到平台推送升级,然后设备升级显示失败,这中间有哪些步骤错了或者遗漏?谢谢。