gpt4 book ai didi

响应 AT 调制解调器,缓冲区数组中的检查值为 0 且不为 NULL?

转载 作者:行者123 更新时间:2023-12-01 14:50:58 25 4
gpt4 key购买 nike

我正在为基于 AT 命令的调制解调器编写驱动程序。这是数据表

http://www.cermetek.com/Catalog/High-Speed-Modems/DataSheet/CH1794_607-0003.pdf

调制解调器通过 USB 到 TTL 转换器串行连接到我的 PC。

调制解调器的响应消息有两种模式:一种是返回数值的简洁或短格式,另一种是返回字符串的长格式。

我想使用简写形式,但遇到了一些问题。响应消息“OK”的缩写形式是 0。我有一个缓冲区,用于读取响应消息。在读取每个响应消息之前清除缓冲区,以确保之前的响应没有重叠。由于在读取响应之前清除,因此缓冲区的初始值为 0 或 NULL,无论响应消息是否为“OK”。这会导致我的程序进入检查值的无限循环。

有什么方法可以使用简短表格正确检查此响应消息?我已经使用长格式测试了代码,它工作正常。当响应消息长度达到 30 个左右时,简短的形式会更容易使用。

注意:这不是语法问题,而是算法问题。

这是主要的代码块

void EM_Modem_Manager(void)
{
switch(m_nModemStateMachine)
{
case MODEM_RESET:
EM_Modem_sendTxCommand(ATZ_COMMAND);
if(m_nModemReceiveBuffer[0] == 'O' && m_nModemReceiveBuffer[1] == 'K')
{
m_nModemStateMachine = MODEM_INIT;
//EM_Modem_sendTxCommand(ATV0_COMMAND); //this is the command that sets the modem in short form
EM_clearReceiveBuffer();
}
break;
case MODEM_INIT:

//does not work this way, ie short form, stuck in MODEM_INIT
//EM_Modem_sendTxCommand(ATX1_COMMAND);
//if(m_nModemReceiveBuffer[0] == 0)
//{
// m_nModemStateMachine = MODEM_POLL_CONNECTION;
// EM_clearReceiveBuffer();
//}

//works this way, ie long form
EM_Modem_sendTxCommand(ATX1_COMMAND);
if(m_nModemReceiveBuffer[0] == 'O' && m_nModemReceiveBuffer[1] == 'K')
{
m_nModemStateMachine = MODEM_POLL_CONNECTION;
EM_clearReceiveBuffer();
}

break;
case MODEM_POLL_CONNECTION:
//some code
break;
case MODEM_CONNECTED:
//some code
break;
}
}

EDIT2:我解决了第一个编辑问题,所以忽略它(实际上我会完全删除它)。我已经隔离了这个问题。简洁的代码在每个结果代码后都回车。这在实际结果代码的位置被覆盖,即当返回结果代码 0 时,它会被返回,但回车或值 13 会立即覆盖它。这适用于所有结果代码。

最佳答案

Is there any way that I can check this response message correctly using the short form?



是的。
您必须编写注意读取的字节数的代码。
确定缓冲区中没有有效字节与一个(或多个)字节是用于解析的有效数据应该是一件小事。

the initial value of the buffer is 0, or NULL



你的程序不应该检查缓冲区的内容,除非数据已经被读操作放在那里。
读取操作应返回放入缓冲区的字节数以及数据。如果您的程序总是检查是否“读取”了多个字节,那么缓冲区的原始内容应该无关紧要。

在读取操作之前初始化或清除缓冲区(如果不是为了调试)通常是不良/不良代码的拐杖。

您可能还尝试对二进制数据使用字符串技术(例如空终止)。
不要那样做。
所有功能性二进制协议(protocol)都有一个与每个可变长度数据 block 或数据报相关联的字节数。只有在处理固定长度的传输或 block 时,才能硬编码长度。

附录

您没有提到它,但手册表明每个简洁代码后跟一个 CR 字符。
换句话说,此响应是二进制字节值与 ASCII 行终止字符的混合体。
但是对于正确和可靠的输入,读取操作应该是非规范的(又名原始),因为退格、换行和回车的 ASCII 代码也是该调制解调器发送的有效简洁代码。

关于响应 AT 调制解调器,缓冲区数组中的检查值为 0 且不为 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23374332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com