完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
工作流程如下:子节点自动发送ID给外部上位机esp_mesh_send(&addr, &sg_ToDs_data, MESH_DATA_TODS, NULL, 0);,root节点通过esp_mesh_recv_toDS函数后通过socket将数据转发给上位机。上位机通过root将控制命令转发给指定的子模块,子模块通过root转发自己的处理结果。
遇到的bug:程序启动时,root节点能正常的接收到子节点发送的数据,上位机也能正常的接收到root节点和子节点的数据。 但是当上位机发送命令由根节点转发到子节点,子节点在返回结果后。子节点的自动发送ID的数据包就不会在被root节点接收到了。root节点的 result = esp_mesh_get_rx_pending(&pending);这个函数接收的pending.toDS 值会一直等于零。但是上位机发送的命令root节点就能正常的转发给子节点,子节点的返回数据也能被root节点接收。唯独子节点自动发送ID的数据不会被接收。 root节点接收数据的代码: void esp_mesh_p2p_rx_main(void *arg) { esp_err_t result; mesh_addr_t from; mesh_addr_t to; mesh_data_t data; uint32_t wifi_data = 0x02; mesh_rx_pending_t pending ; int flag = 0; char temp_string[128]; data.data = rx_buf; data.size = RX_SIZE; while (is_mesh_connected) { vTaskDelay(10); result = esp_mesh_get_rx_pending(&pending); if(result == ESP_FAIL) continue; for(int i = 0; i < pending.toSelf; i++) { //子节点会执行这段代码,接收根节点的数据 result = esp_mesh_recv(&from, &data, portMAX_DELAY, &flag, NULL, 0); if(result == ESP_OK) { memset(temp_string, 0, 128); hex_to_string(temp_string, data.data, data.size); printf("ID %d RECV TO SELF:%srn",g_device_config.paper_number, temp_string); queue_in_buffer(g_tcp_recv_data, (unsigned char *)data.data, data.size); xQueueSendToBack( g_protocol_event, ( void * ) &wifi_data, ( TickType_t ) 10 ); } } for(int i = 0; i < pending.toDS; i++) {//root节点会执行这段代码向上位机转发子节点的数据 result = esp_mesh_recv_toDS(&from, &to, &data, portMAX_DELAY, &flag, NULL, 0); if(result == ESP_OK) { memset(temp_string, 0, 128); hex_to_string(temp_string, data.data, data.size); printf("ID %d RECV TO DS:%srn",g_device_config.paper_number, temp_string); flag = tcp_client_send_data(10000, data.data, data.size); } } } vTaskDelete(NULL); } root节点发送数据给子节点的函数代码: int esp_mesh_send_data(int port, const void *data, int len) { mesh_data_t send_data; mesh_addr_t addr; char temp_string[128]; send_data.data = (uint8_t *)data; send_data.size = len; send_data.proto = MESH_PROTO_BIN; send_data.tos = MESH_TOS_P2P; memcpy(&addr, data + 10, 6); memset(temp_string, 0, 128); hex_to_string(temp_string, data, len); printf("ID %d SEND TO CH:%srn",g_device_config.paper_number, temp_string); esp_mesh_send(&addr, &send_data, MESH_DATA_P2P, NULL, 0); return 0; } 子节点 发送数据的代码 int esp_mesh_add_send_queue(int port ,const void *data, int len) { queue_in_buffer(sg_send_data, (unsigned char *)data, len); xQueueSendToBack( sg_send_len, ( void * ) &len, ( TickType_t ) 10 ); return 0; } static void esp_mesh_send_data_task(void *pvParameters) { mesh_addr_t addr; uint32_t send_len; unsigned char data[1024]; char temp_string[128]; while(true) { if(xQueueReceive(sg_send_len, &send_len, portMAX_DELAY) == pdTRUE) { memset(data, 0, 64); memset(&sg_ToDs_data, 0, sizeof(mesh_data_t)); queue_out_buffer(sg_send_data, data, send_len); sg_ToDs_data.data = (uint8_t *)data; sg_ToDs_data.size = send_len; sg_ToDs_data.proto = MESH_PROTO_BIN; sg_ToDs_data.tos = MESH_TOS_P2P; memset(temp_string, 0, 128); hex_to_string(temp_string, data, send_len); printf("ID %d SEND TO DS:%srn",g_device_config.paper_number, temp_string); //子节点所有的数据发送都会从这个任务中依次执行,不会出现重复调用的情况 esp_mesh_send(&addr, &sg_ToDs_data, MESH_DATA_TODS, NULL, 0); } } } 请各位大佬帮忙看看这个奇怪的bug是怎么引起的。 |
|
相关推荐
1个回答
|
|
这个问题可能有以下几个原因:
1. **资源限制**:如果子节点在处理上位机的命令时占用了大量的资源(如CPU、内存等),可能会导致子节点无法及时发送ID数据包,或者root节点无法接收到这些数据包。 2. **网络拥塞**:如果网络中的数据包过多,可能会导致网络拥塞,从而影响数据包的传输。这种情况下,root节点可能无法接收到子节点发送的数据包。 3. **数据包丢失**:在无线通信中,数据包可能会因为各种原因(如信号干扰、距离过远等)而丢失。如果root节点无法接收到子节点发送的数据包,可能是因为数据包在传输过程中丢失了。 4. **软件bug**:可能存在一些软件bug,导致root节点在接收到子节点发送的数据包后,无法正确处理这些数据包。这种情况下,需要检查代码,找出可能存在的问题。 5. **配置问题**:可能是由于配置不当导致的。例如,如果子节点的发送频率过高,可能会导致root节点无法接收到所有数据包。这种情况下,需要调整发送频率,以确保root节点能够接收到所有数据包。 为了解决这个问题,你可以尝试以下方法: 1. **优化资源使用**:检查子节点和root节点的资源使用情况,确保它们在处理数据包时不会占用过多的资源。 2. **增加网络容量**:如果可能的话,尝试增加网络的容量,以减少网络拥塞的可能性。 3. **检查信号质量**:检查子节点和root节点之间的信号质量,确保它们之间的通信不受干扰。 4. **调试代码**:仔细检查代码,找出可能存在的问题,并进行修复。 5. **调整配置**:根据实际情况调整子节点的发送频率,以确保root节点能够接收到所有数据包。 希望这些建议能帮助你解决问题。如果问题仍然存在,请提供更多的信息,以便我们能够更准确地分析问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
166个成员聚集在这个小组
加入小组1153 浏览 1 评论
583浏览 6评论
480浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
465浏览 5评论
466浏览 4评论
441浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 11:01 , Processed in 0.915461 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号