完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
硬件平台为:STM32F103RCT6 + ESP8266软件版本为:RTT — 4.02 AT version:1.2.0.0 软件流程:上电后自动连接到指定wifi —->> 开启服务端多链接模式 —>> PC端通过TCP调试助手连接到ESP8266 —>> TCP助手发送字符串到 ESP8266 —>> STM32解析数据后返回数据到客户端。 问题描述:STM32解析数据后返回数据到客户端步骤出错,在第一次连接成功后发送数据是可以正常返回 但是接下来就再也无法解析+IPD开头的数据了 以下为我判断可能出错的代码段(不调用此函数+IPD数据头的数据都可以正常接收):
static void urc_func_ipd_data(struct at_client *client, const char *data, rt_size_t size) 求指点!! |
|
相关推荐
3个回答
|
|
从你的日志看,第一次发送数据的时候已经出现 busy p…. busy s….,说明时候发送数据流程已经有问题了,查看代码可能是因为你定义的 send_data_to_client 函数中 > 函数处理问题
|
|
|
|
已解决,附上处理代码。
static void urc_func_ipd_data(struct at_client client, const char data, rt_size_t size) { int device_socket = 0; rt_int32_t timeout = 0; rt_uint16_t bfsz = 0, temp_size = 0; char *recv_buf = RT_NULL, temp[8] = {0}; RT_ASSERT(data && size); /* get the at deveice socket and receive buffer size by receive data */ sscanf(data, "%*[^IPD]IPD,%d,%d%*[^:]", &device_socket, (int *) &bfsz); rt_kprintf("+IPD,[%d][%d]:rn", device_socket,bfsz); // 发送控制指令 /* set receive timeout by receive buffer length, not less than 10ms */ timeout = bfsz > 3 ? bfsz : 3; if (device_socket < 0 || bfsz == 0) return; recv_buf = (char *) rt_calloc(1, bfsz); if (recv_buf == RT_NULL) { LOG_E("no memory receive buffer(%d).", bfsz); /* read and clean the coming data */ while (temp_size < bfsz) { if (bfsz - temp_size > sizeof(temp)) { at_client_obj_recv(client, temp, sizeof(temp), timeout); } else { at_client_obj_recv(client, temp, bfsz - temp_size, timeout); } temp_size += sizeof(temp); } return; } /* sync receive data */ if (at_client_obj_recv(client, recv_buf, bfsz, timeout) != bfsz) { LOG_E("device receive size(%d) data failed.", bfsz); rt_free(recv_buf); return; } // rt_kprintf(“WiFi RECV Command[%d][%d]:”, device_socket,bfsz); // 发送控制指令 // for (int i = 0; i < bfsz; i++) { // rt_kprintf(“%02X “, *(recv_buf + i)); // 发送控制指令 // } // rt_kprintf(“rn”); // 发送控制指令 // 处理接收到的字符串 dealServerMessage((rt_uint8_t*)recv_buf, device_socket, bfsz); rt_free(recv_buf); } // 注册处理函数 static struct at_urc urc_table[] = { {“+IPD”, “:”, urc_func_ipd_data}, }; |
|
|
|
发送函数:
rt_err_t send_data_to_client(unsigned char client_num, const char *buff, rt_size_t bfsz) { size_t cur_pkt_size = 0, sent_size = 0; at_response_t resp = RT_NULL; rt_err_t result = RT_EOK; // char cmd_buf[128] = {0}; // rt_uint16_t wait_times = 500; // // rt_uint8_t test_buf = “Hello”; / 创建响应结构体,设置最大支持响应数据长度为 512 字节,响应数据行数无限制,超时时间为 5 秒 / resp = at_create_resp(512, 0, 2 RT_TICK_PER_SECOND); if (!resp) { LOG_E("No memory for response structure!"); return -RT_ENOMEM; } /* set AT client end sign to deal with '>' sign */ at_set_end_sign('>'); while (sent_size < bfsz) { if (bfsz - sent_size < 128) { cur_pkt_size = bfsz - sent_size; } else { cur_pkt_size = 128; } /* send the "AT+CIPSEND" commands to AT server than receive the '>' response on the first line */ if (at_exec_cmd(resp, "AT+CIPSEND=%d,%d", client_num, cur_pkt_size) < 0) { result = -RT_ERROR; goto __exit; } /* send the real data to server or client */ result = (int) at_client_send(buff + sent_size, cur_pkt_size); if (result == 0) { result = -RT_ERROR; goto __exit; } sent_size += cur_pkt_size; } result = RT_EOK; __exit: at_set_end_sign(0); if(resp) { at_delete_resp(resp); } return result; } |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
541 浏览 0 评论
1920 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2188 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统威廉希尔官方网站 与产业发展论坛”圆满结束
2681 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
29139 浏览 11 评论
72211 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 13:37 , Processed in 0.430452 second(s), Total 42, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号