Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
AT
使用AT扩展包发送socket数据后出错求助。
发布于 2019-11-08 10:43:10 浏览:1640
订阅该版
硬件平台为:STM32F103RCT6 + ESP8266软件版本为:RTT -- 4.02 AT version:1.2.0.0 软件流程:上电后自动连接到指定wifi --->> 开启服务端多链接模式 -->> PC端通过TCP调试助手连接到ESP8266 -->> TCP助手发送字符串到 ESP8266 -->> STM32解析数据后返回数据到客户端。 **问题描述**:STM32解析数据后返回数据到客户端步骤出错,在第一次连接成功后发送数据是可以正常返回 ![11111.png](/uploads/201911/08/103533hvrmirl4i4xrca8c.png) 但是接下来就再也无法解析+IPD开头的数据了 ![22222.png](/uploads/201911/08/104040w9ut4mnvc0i2wmki.png) 以下为我判断可能出错的代码段(不调用此函数+IPD数据头的数据都可以正常接收): ```rt_err_t send_data_to_client(unsigned char client_num, unsigned char *data, unsigned short len) { 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, 5 * RT_TICK_PER_SECOND); if (!resp) { LOG_E("No memory for response structure!"); return -RT_ENOMEM; } // 请求发送 sprintf(cmd_buf,"AT+CIPSEND=%d,%d
", client_num, len); result = at_exec_cmd(resp, cmd_buf); at_set_end_sign('
'); if (result != RT_EOK) { LOG_E("AT client send commands failed or return response error!"); LOG_E("Error commands:%s", cmd_buf); goto __exit; } /* Print response line buffer */ // show_recv_msg(resp); // rt_device_write(device, 0, test_buf, 5); at_exec_cmd(RT_NULL, test_buf); // at_exec_cmd(RT_NULL, (char*)data); // show_recv_msg(resp); while (wait_times--) { if (WifiInfo.recv_send_data_len == len) { WifiInfo.recv_send_data_len = 0; result = RT_EOK; break; } rt_thread_mdelay(5); } if (wait_times == 0) { result = RT_ETIMEOUT; } __exit: if(resp) { at_delete_resp(resp); } return result; } ```这是我的ipd数据处理urc函数: ``` static void urc_func_ipd_data(struct at_client *client, const char *data, rt_size_t size) { rt_kprintf("in in in
"); // 发送控制指令 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,%d,%d:", &device_socket, (int *) &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("
"); // 发送控制指令 dealServerMessage((rt_uint8_t*)recv_buf, device_socket, bfsz); rt_free(recv_buf); } static struct at_urc urc_table[] = { {"+IPD,", ":", urc_func_ipd_data}, // {"", ">", urc_func_clear}, {"SEND OK", "
", urc_send_func}, {"SEND FAIL", "
", urc_send_func}, {"Recv", "bytes
", urc_send_bfsz_func}, {"", ",CLOSED
", urc_func_close}, {"", ",CONNECT
", urc_func_connect}, {"WIFI GOT IP", "
", urc_conn_func}, }; ``` 求指点!!
查看更多
3
个回答
默认排序
按发布时间排序
Cheney_Chen
2019-11-11
这家伙很懒,什么也没写!
从你的日志看,第一次发送数据的时候已经出现 busy p.... busy s....,说明时候发送数据流程已经有问题了,查看代码可能是因为你定义的 send_data_to_client 函数中 `>` 函数处理问题,参考 ESP8266 设备中 `>` 处理方式: [https://github.com/RT-Thread-packages/at_device/blob/master/class/esp8266/at_socket_esp8266.c#L229-L256](https://github.com/RT-Thread-packages/at_device/blob/master/class/esp8266/at_socket_esp8266.c#L229-L256)
zx595
2019-12-31
这家伙很懒,什么也没写!
已解决,附上处理代码。 ``` 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]:\r\n", 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("\r\n"); // 发送控制指令 // 处理接收到的字符串 dealServerMessage((rt_uint8_t*)recv_buf, device_socket, bfsz); rt_free(recv_buf); } // 注册处理函数 static struct at_urc urc_table[] = { {"+IPD", ":", urc_func_ipd_data}, }; ```
zx595
2019-12-31
这家伙很懒,什么也没写!
发送函数: ``` 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; } ```
撰写答案
登录
注册新账号
关注者
0
被浏览
1.6k
关于作者
zx595
这家伙很懒,什么也没写!
提问
9
回答
12
被采纳
0
关注TA
发私信
相关问题
1
rt-thread 2g/3g/4g通信模块的教程有吗?
2
基于AT指令,用esp8266如何连接mqtt?
3
AT组件使用问题
4
官方AT客户端应用笔记的几个小tip
5
RTT的SAL能够判断使用LWIP或者AT?
6
rt_therad AT组件移植不成功(结贴)
7
AT组件在哪个版本的?
8
AT组件 连接 Onenet 连接失败
9
esp8266 AT指令 MQTT连接问题
10
AT组件使用问题之模块主动上报【已解决】
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
2
RT-Thread EtherKit开源以太网硬件正式发布
3
如何在master上的BSP中添加配置yml文件
4
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
5
RT-Thread 发布 EtherKit开源以太网硬件!
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
15
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部