嵌入式技术论坛
直播中

李刚

7年用户 1317经验值
私信 关注
[问答]

新手求助AT Command缓冲区数据没有进入resp结构如何解决?

我正在学习使用AT Command,但是出现了问题,无法解决。
任何帮助,将不胜感激。

代码是:

void at_thread_entry()
{
temp_t *h_temp = &temp;
rt_uint32_t e;
struct tm t;
uint8_t result;
while(1)
{
if ( RT_EOK == rt_event_recv(&h_temp->event, 0x01, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, &e) )
{
rt_thread_mdelay(1000);
at_response_t resp = RT_NULL;
resp = at_create_resp(512, 0, rt_tick_from_millisecond(5000));
if( !resp )
{
rt_kprintf("No memory for response structure!\r\n");
break;
}
if(at_exec_cmd(resp, "AT$$
TIME?") != RT_EOK)
{
rt_kprintf("at_exec_cmd error\r\n");
break;
}
else
{
at_resp_get_line(resp, 2);
//at_resp_parse_line_args_by_kw(resp, "

TIME:", "$$TIME: %d, %d-%d-%d,%d:%d:%d", &result, &t.tm_year, &t.tm_mon, &t.tm_wday, &t.tm_hour, &t.tm_min, &t.tm_sec); } rt_kprintf("resp: %s\r\n", resp->buf); rt_kprintf("Time : %d %d-%d-%d %d:%d:%d\r\n", result, t.tm_year, t.tm_mon, t.tm_mday, &t.tm_hour, &t.tm_min, &t.tm_sec); at_delete_resp(resp); } 日志是: \ | / - RT - Thread Operating System / | \ 4.0.2 build Jan 3 2023 2006 - 2019 Copyright by rt-thread team msh />[I/at.clnt] AT client(V1.3.0) on device lpuart1 initialize success. . . 跳过 . . [D/AT] sendline: 0000-0020: 41 54 24 24 54 49 4D 45 3F AT

TIME?
[D/AT] recvline: 0000-0020: 0D 0A ..
[D/AT] recvline: 0000-0020: 24 24 54 49 4D 45 3A 20 30 2C 20 32 30 32 33 2D 30 31 2D 30 34 2C 31 34 3A 35 31 3A 31 34 2C 57

TIME: 0, 2023-01-04,14:51:14,W
[D/AT] recvline: 0020-0040: 45 44 0D 0A ED..
[D/AT] recvline: 0000-0020: 0D 0A ..
[D/AT] recvline: 0000-0020: 4F 4B 0D 0A OK..
resp:
Time : -559038737 -559038737--559038737--559038737 536915056:536915052:536915048

目前,所需的缓冲区数据根本没有进入“resp”结构。
因此无法解析与 at_resp_ 相关的内容。
已经几天了,我不知道问题出在哪里。
我想接收从 LTE 调制解调器接收到的时间信息。
如果你能给我一个关于如何解决这个问题的答案,我将不胜感激。

回帖(4)

李丹

2023-2-13 14:01:52
通过日志来看,设备的回应是正确的。
if (at_exec_cmd(resp, "AT$$TIME?") != RT_EOK)
{
    rt_kprintf("at_exec_cmd errorrn");
    break;
}
/* Print response line buffer */
LOG_D("Response buffer");
for (int line_num = 1; line_num <= resp->line_counts; line_num++)
{
    if ((line_buffer = at_resp_get_line(resp, line_num)) != RT_NULL)
    {
        LOG_D("line %d buffer : %s", line_num, line_buffer);
    }
    else
    {
        LOG_E("Parse line buffer error!");
    }
}
举报

李刚

2023-2-13 14:02:20
非常感谢你的回复!
我通过附上你添加的代码进行了测试,但是resp结构中没有数据。
可能是什么问题呢?

2.jpg
2.jpg
举报

李丹

2023-2-13 14:03:06
中间那行怎么被吞了,你有没有注册URC消息?
举报

李刚

2023-2-13 14:03:15
哇…非常感谢你。
由于 URC,数据丢失!!!
终于解决了。 非常感谢你!
举报

更多回帖

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