Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
resp中buf为原始响应数据没有去除结束符的数据?
发布于 2022-02-22 15:34:30 浏览:714
订阅该版
在API中at_response介绍,其中 buf 用于存放接收到的响应数据,注意的是 buf 中存放的数据并不是原始响应数据,而是原始响应数据去除结束符("\r\n")的数据,buf 中每行数据以 '\0' 分割,方便按行获取数据。 但是我实际是使用中,没有并没有去掉结束符,还是需要算上结束符的行数才能解析正确,是需要设置哪里吗? ![at.PNG](https://oss-club.rt-thread.org/uploads/20220222/d63b057efbc1bd8422e137378e0abba3.png)
查看更多
kevinzu
2022-02-22
人认为我,我为人人
从获取一行的代码看: ![image.png](https://oss-club.rt-thread.org/uploads/20220222/ccad7d3c86100df5955ccd74eb782d60.png) 接收到的字符都放到,client的recv_line_buf中了。 然后才判断是否是一行,且client->recv_line_len正是包含\\r\\n在内接收的长度。 再看从client->recv_line_buf到resp->buf的拷贝过程: ![image.png](https://oss-club.rt-thread.org/uploads/20220222/6222b9efe6cbe28467278aa3e008b8f3.png) 可以看到,拷贝的长度就是rec_line_len。拷贝内容只是最后一个\\n变成了\\0。 从代码看,最新释放版本没有你说的设置。 其实替换结尾信息对你的解析没有任何影响: 参考对resp->buf中行信息的处理代码: ```c char *resp_buf = resp->buf; for(int line_num = 1;line_num <= resp->line_counts;line_num ++) { rt_kprintf("%s\n",resp_buf); resp_buf += strlen(resp_buf) + 1; } ``` 这样打印出来的内容就是你收到的。
2
个回答
默认排序
按发布时间排序
crystal266
2022-02-22
嵌入式
默认的存储的数据就是带上 "\\r\\n" 的,每次也是从缓冲区里面读取一行的数据(以 "\\r\\n" 做结束符),然后取出一行数据进行解析判断的,因为 AT 指令默认的就是以 "\\r\\n" 作为结束符的。 可以看一下 at_recv_readline() 代码,最后就是根据 "\\r\\n" 结束符来跳出 while(1) 循环的。在解析中 \\r\\n 是占行数的,比如说收到的是`AT\\r\\n\\r\\nOK\\r\\n`,这一共是三行,第二行是`\\r\\n`空行。 ```c static int at_recv_readline(at_client_t client) { rt_size_t read_len = 0; char ch = 0, last_ch = 0; rt_bool_t is_full = RT_FALSE; rt_memset(client->recv_line_buf, 0x00, client->recv_bufsz); client->recv_line_len = 0; while (1) { at_client_getchar(client, &ch, RT_WAITING_FOREVER); if (read_len < client->recv_bufsz) { client->recv_line_buf[read_len++] = ch; client->recv_line_len = read_len; } else { is_full = RT_TRUE; } /* is newline or URC data */ if ((ch == '\n' && last_ch == '\r') || (client->end_sign != 0 && ch == client->end_sign) || get_urc_obj(client)) { if (is_full) { LOG_E("read line failed. The line data length is out of buffer size(%d)!", client->recv_bufsz); rt_memset(client->recv_line_buf, 0x00, client->recv_bufsz); client->recv_line_len = 0; return -RT_EFULL; } break; } last_ch = ch; } #ifdef AT_PRINT_RAW_CMD at_print_raw_cmd("recvline", client->recv_line_buf, read_len); #endif return read_len; } ```
撰写答案
登录
注册新账号
关注者
0
被浏览
714
关于作者
FCNP_3219
这家伙很懒,什么也没写!
提问
3
回答
0
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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
[E/app.filesystem] SD card mount to '/sdcard' failed!
2
单片机也能聊天?RT-Thread上跑通大语言模型
3
【RT-Thread】【ci】【scons】将ci.attachconfig.yml和scons结合使用
4
Rt-thread中OTA下载后,bootloader不搬程序
5
ulog 日志 LOG_HEX 输出时间改为本地日期时间
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1518
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
549
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
3
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部