嵌入式技术论坛
直播中

goodmbby

9年用户 1259经验值
擅长:处理器/DSP
私信 关注
[问答]

RTT-Studio在运行如下代码时sscanf函数没有如预期返回正确结果咋办?

RTT-Studio版本:Version: 1.0.0 Build id: 201912201745
RT-Thread版本:V4.02
测试用芯片:STM32F103RCT6

问题描述:在运行如下代码时sscanf函数没有如预期返回正确结果。

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);
rt_kprintf("%s
", data); // 发送控制指令
/
get the at deveice socket and receive buffer size by receive data /
sscanf(data, "%
[^IPD]IPD,%d,%d%*[^:]", &device_socket, (int *) &bfsz);
// sscanf(data, “+IPD,%d,%d:”, (int *) &bfsz, &device_socket);
rt_kprintf(“+IPD,[%d][%d]:
“, device_socket,bfsz); // 发送控制指令
// rt_kprintf(“+IPD,[%d][%d]:
“,bfsz, device_socket); // 发送控制指令

/下面的应该没影响/

/* 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);
}```

下图是是同RTT-Studio工具自带的调试工具调试的结果:

2.jpg

我这段函数是解析AT指令的,使用sscanf函数提取数据
可以在途中看到调试信息:+IPD,0,16: 无法提取第一个数据
,第二个数据是正常的。

我开始是怀疑程序有问题, 就找了个在线工具调试如下:

2.jpg

可以看到数据是正常的。

这段解析的代码在以前的应用中(MDK编译)也是没问题的,请问是RTT-Studio编译的问题吗?

回帖(1)

王秀珍

2023-1-31 14:52:49
把上面你 URC 处理函数中 bfsz 参数类型定义成 int 或者 uint32_t 类型试试。
sscanf 函数中对入参类型的判断还是挺严格的,你这里解析用了 %d,后面带的参数就需要使用 4 个字节类型,否则会出现参数覆盖等问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分