硬件配置:【STM32F407ZET6】
软件配置:【RT-Thread Studio 版本: 2.2.6】 【rt-thread [4.0.3]】 【ad_device [latest]】
程序如下:
#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>
#include <rtconfig.h>
#include <rtdbg.h>
#include <at_device_ml307.h>
#include "task_ML307A.h"
/*初始化ML307A at_client*/
static int ml307_device_register(void)
{
at_client_init("uart2", ML307_SAMPLE_RECV_BUFF_LEN);
return RT_EOK;
}
INIT_APP_EXPORT(ml307_device_register);
/*ML307A结构体回调函数 */
void CallBack(char *Cmd, float Cycle)
{
}
/*初始化ML307A命令结构体,回调函数暂时没用到 */
typML307A_t typML307ACmdTable[] =
{
{ "AT+MIPOPEN=0,\"TCP\",\"8.135.10.183\",39982,60,0", CallBack }, //5:连接服务器IP端口,数据发送
{ "AT+MIPSEND=0,11,\"12345678900\"", CallBack }, //6:发送数据
};
/*重新配置ML307A */
int ML307A_init_Reconfiguring(void)
{
at_response_t resp = RT_NULL;
const char *line_buffer = RT_NULL;
/* 创建响应结构体,设置最大支持响应数据长度为 512 字节,响应数据行数无限制,超时时间为5 秒 */
resp = at_create_resp(512, 0, rt_tick_from_millisecond(5000));
if (!resp)
{
LOG_E("No memory for response structure!");
return -RT_ENOMEM;
}
/* 发送 AT 命令并接收 AT Server 响应数据,数据及信息存放在 resp 结构体中并打印出来 */
for (int i = 0; i < array_sizeof(typML307ACmdTable); i++)
{
if (at_exec_cmd(resp, typML307ACmdTable[i].CmdString) != RT_EOK) //发送AT指令
{
LOG_E("%s Command not received response from ML307A", typML307ACmdTable[i].CmdString);
}
else
{
for (rt_size_t line_num = 1; line_num <= resp->line_counts; line_num++) //将回应的数据打印出来
{
if ((line_buffer = at_resp_get_line(resp, line_num)) != RT_NULL)
{
LOG_D("%s line%d Response buf: %s",typML307ACmdTable[i].CmdString,line_num, line_buffer);
}
else
{
LOG_E("Parse line buffer error!");
}
}
}
}
/* 命令发送成功 */
LOG_D("AT Client send commands to AT Server success!");
/* 删除响应结构体 */
at_delete_resp(resp);
return RT_EOK;
}
int main(void)
{
int count = 1;
ML307A_init_Reconfiguring();
while (count++)
{
rt_thread_mdelay(1000);
}
return RT_EOK;
}
现象如下:
可以看到TCP服务端接收到了消息,但是并没有打印正常的回复消息。
这是通过串口助手发送的指令,可以正常接收
不理解使用AT_Device这个没有正确的回复是什么情况,求大佬指点。😭
上电之后直接运行的?网络注册好了吗,自动注册的话可以做个简单测试,在main函数执行ML307A_init_Reconfiguring
之前加点延时等网络注册完。
是上电直接运行。
一些初始化检测的命令直接用的AT_device组件中at_device_ml307.c
文件INIT_DEVICE_EXPORT(ml307_device_class_register);
都是官方提供的【at_device/blob/master/class/ml307/at_device_ml307.c】
不是自动注册的。
试了加延时还是同样的现象。
感觉是接收的问题,飞线看看指令有没有发成功
每条指令等待时间长一点
还是上面的程序,这是打印结果👀
这很明显了,urc报了个错误的响应
手册应该有推荐的数据收发流程,看一下哪些配置项是必须的,按流程来搞
@踩姑娘的小蘑菇
这个error是连接了TCP服务端,但没有断开连接,再次复位开发板,他又发送指令连接了一次。
@Lyx_
那你已经找到原因了,后面就是考虑怎么处理这个异常的指令流程
@JonasWen
哈哈哈
我现在 在连接客户端之前 先断开连接,执行程序倒是没有错误但也没有打印回复的数据。
人麻了……………………🤦♂️
@Lyx_
看一下日志库的宏定义,应该是你没定义调试模式所以
LOG_D
的语句没有编译进去@JonasWen
开启
#define AT_DEBUG
宏定义就好了,相关程序如下。🤦♂️