This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC3220MOD:CC3220MOD 和 AT Command Demo 4 Urgent ****

Guru**** 2553260 points
Other Parts Discussed in Thread: CC3220MOD

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/737256/cc3220mod-cc3220mod-and-at-command-demo-urgent

器件型号:CC3220MOD

你(们)好

我将 CC3220MOD 与 AT Command Demo 搭配使用。

我在前一个主题 https://e2e.ti.com/support/wireless-connectivity/wifi/f/968/p/711070/2621072#2621072中已经讲过

关于使用 AT+SendTo 命令发送字节数据时的问题、其中数据与0x0D 匹配、而 AT 命令演示会将哪一个数据解释为消息的末尾、而不是。  

我实施了一项解决方案、在该方案中、我发送双字节格式的数据、并在到达云时将其剥回。  

但问题现在又重新出现了…

现在、我需要使用 AT+file_write 将根证书发送到闪存。 文件采用.pem 格式。 WPA2-Enterprise EAP-TLS 网络需要这些功能。

这些.pem 文件在整个文件中定期放置 LF (0x0A)。 使用 AT+file_write 发送数据时、AT 从设备将0x0A 确定为消息末尾。

现在、我原以为只有 CR (0x0D)用于 AT 命令演示中的消息结束(我的代码使用 GAP 超时、而不是终止字符)。

但我显然错了、它可以是0x0A 或0x0D。

我认为一个简单的修复方法是将 AT 命令演示修改为仅响应0x0D、 因此.pem 文件中的0x0A 不会影响处理程序。 但我不确定.pem 文件是否会包含0x0D 字符。 我在这里拥有的所有证书仅包含0x0A 或可打印字符、不包含0x0D。

我很快就需要在客户处进行试用、需要尽快帮助。

请思考。  

此致

Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它认为最好和最简单的解决方案是更改为 AT Command Demo、因此它不再使用 CR 和 LF 字符来检测消息末尾、而是使用0x8A 代替0x0A 和0x8D 而不是0x0D。 这对于证书 PEM 文件来说很好。 你同意吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我刚才下载了最新的 Service Pack 2.30、它指出终止错误已修复。
    参考 CC3x20SDK-1316:
    是否有有关修复程序的更多信息、如何确定消息结束。?

    此致
    Nick
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nick、

    II 正在检查代码、看起来消息的末尾 (使用二进制数据)是根据数据之前的[length]参数确定的。

    BR、

    Kobi

      

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    sendto 在命令中始终具有有效负载的长度、这早于 SDK 2.30中的上述修复日期。
    查看代码、它仍然使用/n /r 字符来确定消息末尾。 这意味着内容中包含/n /r 的有效载荷将导致命令失败。
    这也会影响 AT+FileWrite 上的我,并且我无法将 pem 格式的证书传输到设备。 因为证书始终具有/r 或/n 个字符。

    我认为修复方法涉及到间隔超时作为消息结束的检测方法。 这是我在 AT 主站中实现的东西。 但我知道这会在使用终端程序时破坏兼容性。 在上面、我建议将消息字符的结尾从/n /r 更改为.pem 格式文件中不存在的不可打印字符。 这不能解决 sendto 问题、但我已经修复了 sendto、我发送双字节数据。

    请发表评论
    Nick
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我再次查看了代码。 当它接收到第一个/n 或/r 时、如果命令是 sendto 或 send、它会附加到数据 Rx buf 中、看起来处理程序正在寻找/n 或/r。

    下面、我向其中添加了 FileWrite 命令、因此我可以发送.pem 文件。

    我稍后将对此进行测试。

    Nick

    /*********
    int32_t ATCommands_readCmd (void)
    {
    int32_t lRetVal;
    uint32_t i = 1;
    char *pbuf;
    uint16_t length、readLen、offset;
    int16_t 残留;
    uint8_t 格式= ATCMD_DATA_FORMAT_Base64;
    char tmpBuf[16]、*pTmpBuf;
    
    while (i)
    {
    pbuf = NULL;
    usleep(100);
    /*轮询 UART 终端以接收由'/r'终止的用户命令*/
    lRetVal = GetRawCmd ((char *) ATCommands_cmdBuffer、ATCOMMANDS_CMD_buffer_size);
    if (lRetVal <= 1)
    {
    //uart_print ("\n"r);
    继续;
    }
    偏移= lRetVal;
    
    /*发送*/
    /* sendto */
    // Nick,2018年10月16日
    //添加了 ATCmd_fileWriteStr
    //if ((strstr (ATCommands_cmdBuffer、ATCmd_sockSendStr)))||(strstr (ATCommands_cmdBuffer、ATCmd_sockSendToStr)))
    
    if ((strstr (ATCommands_cmdBuffer、ATCmd_sockSendStr)))||(strstr (ATCommands_cmdBuffer、ATCmd_sockToStr)) Commands|(strstr (ATSTR_SendBuffer、ATCmd_fileWriteStr)))))
    {
    pbuf = strchr (ATCommands_cmdBuffer、ATCMD_DELIM_ARG)+ 1;
    }
    
    if (pbuf!= NULL)
    {
    pTmpBuf = tmpBuf;
    strncpy (pTmpBuf、pbuf、sizeof (tmpBuf));
    /*格式*/
    StrMpl_getVal (&pTmpBuf、&format、ATCMD_DELIM_ARG、STRMPL_FLAMP_SIZE);
    if (格式= ATCMD_DATA_FORMAT_BINARY)
    {
    /*数据长度*/
    StrMpl_getVal (&pTmpBuf、&length、ATCMD_DELIM_ARG、STRMPL_FLAM_SIZE);
    /* pTmpBuf 现在指向数据部分的开头*/
    //额外的1是在末尾考虑 NULL 字符
    readLen=lRetVal (pbuf-atCommands_cmdBuffer)-(pTmpBuf-tmpBuf)-1;
    残留物= length-readLen;
    offset=lRetVal;
    //表示请求的长度小于实际有效载荷
    如果(残留物< 0)
    {
    //uart_print ("\n\n\rERROR:长度小于有效载荷\n");
    继续;
    }
    while (残留物>0)
    {
    /*读取残留物*/
    lRetVal=GetRawCmd ((char *)&ATCommands_cmdBuffer[offset]、残留);
    如果(lRetVal < 1)
    {
    //uart_print ("\n"r);
    中断;
    }
    残留物-= lRetVal;
    offset += lRetVal;
    //表示请求的长度小于实际有效载荷
    如果(残留物< 0)
    {
    //uart_print ("错误:长度小于有效载荷\n\r\n);
    继续;
    }
    }
    if (lRetVal < 1)//表示来自 while 循环的无效中断
    {
    继续;
    }
    }
    
    //uart_print ("\n"r);
    /*删除最后一个 CR 或 LF 字符*/
    ATCommands_cmdBuffer[offset - 1]='\0';
    ATCmd_send (ATCommands_cmdBuffer);
    }
    返回(0);
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "length"之前存在、但"n"或"\r\n"终止了输入缓冲器。
    现在、'\n'或'\r'被存储在输入缓冲器中、并且终止只基于长度(对于二进制数据、请参阅 ATCommands_readCmd 中"rand"变量周围的逻辑)。

    BR、
    Kobi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    现在、使用 SDK 2.30中更新的 AT 命令演示完成一些测试

    现在使用 AT+Sendto 命令断开功能。 为处理有效载荷中的/n 和/r 数据以及使用残值继续加载剩余消息而进行的额外更改。

    NEW AT DEMO 返回数据发送为 SHORT。 查看代码。 该代码仅适用于 AT+Send、其中的格式和长度以及位置1和2。 当您使用 AT+SendTo 时、它将系列解码为0、端口号解码为长度。 在本例中、我的端口号是49125。  显然、此命令未在 TI 进行测试、仅在 AT+Send 命令中进行测试。

    此外、需要将 AT+FileWrite 命令添加到相同的更改中。

    请进行命令

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想我现在已经解决了这个问题。  

    下面是 at_commands.c 中的代码。 SDK 2.30中的原始项目

    为 sendto 添加了额外的指针移位、它需要3个移位、然后发送。

    还添加了 FileWrite 命令、该命令用于发送二进制数据。

    我还没有测试过它。 它是否都能正常工作。

    Nick Price。

    int32_t ATCommands_readCmd (void)
    {
    int32_t lRetVal;
    uint32_t i = 1;
    char *pbuf;
    uint16_t length、readLen、offset;
    int16_t 残留;
    uint8_t 格式= ATCMD_DATA_FORMAT_Base64;
    char tmpBuf[16]、*pTmpBuf;
    
    //uart_print ("Enter at Command:\n\n"r);
    while (i)
    {
    pbuf = NULL;
    usleep(1000);
    /*轮询 UART 终端以接收由'/r'终止的用户命令*/
    lRetVal = GetRawCmd ((char *) ATCommands_cmdBuffer、ATCOMMANDS_CMD_buffer_size);
    if (lRetVal <= 1)
    {
    UART_PRINT ("\n\n"r);
    继续;
    }
    偏移= lRetVal;
    
    
    
    //检查命令 send 和 sendto,两者都以相同的前缀开头
    if (strstr (ATCommands_cmdBuffer、ATCmd_sockSendStr))
    {
    /*发送*/
    /* sendto */
    
    //移过句柄
    pbuf = strchr (ATCommands_cmdBuffer、ATCMD_DELIM_ARG)+ 1;
    //如果 sendto、格式和长度处于不同的位置
    if (strstr (ATCommands_cmdBuffer、ATCmd_sockSendToStr))
    {
    //移过家族
    pbuf = strchr (pbuf、ATCMD_DELIM_ARG)+ 1;
    //移过端口
    pbuf = strchr (pbuf、ATCMD_DELIM_ARG)+ 1;
    //移动过去的地址
    pbuf = strchr (pbuf、ATCMD_DELIM_ARG)+ 1;
    }
    
    }
    否则 if (strstr (ATCommands_cmdBuffer、ATCMD_fileWriteStr))
    {
    // FileWrite
    //移动过去的 fileID
    pbuf = strchr (ATCommands_cmdBuffer、ATCMD_DELIM_ARG)+ 1;
    //移过偏移量
    pbuf = strchr (ATCommands_cmdBuffer、ATCMD_DELIM_ARG)+ 1;
    }
    
    if (pbuf!= NULL)
    {
    pTmpBuf = tmpBuf;
    strncpy (pTmpBuf、pbuf、sizeof (tmpBuf));
    /*格式*/
    StrMpl_getVal (&pTmpBuf、&format、ATCMD_DELIM_ARG、STRMPL_FLAMP_SIZE);
    if (格式= ATCMD_DATA_FORMAT_BINARY)
    {
    /*数据长度*/
    StrMpl_getVal (&pTmpBuf、&length、ATCMD_DELIM_ARG、STRMPL_FLAM_SIZE);
    /* pTmpBuf 现在指向数据部分的开头*/
    //额外的1是在末尾考虑 NULL 字符
    readLen = lRetVal -(pbuf - ATCommands_cmdBuffer)-(pTmpBuf - tmpBuf)- 1;
    残留物=长度- readLen;
    偏移= lRetVal;
    //表示请求的长度小于实际有效载荷
    如果(残留物< 0)
    {
    UART_PRINT ("\n\n\rERROR:len < PAYLOAD\n");
    继续;
    }
    
    while (残留物>0)
    {
    /*读取残留物*/
    lRetVal = GetRawCmd ((char *)&ATCommands_cmdBuffer[offset]、残留);
    如果(lRetVal < 1)
    {
    UART_PRINT ("\n\n"r);
    中断;
    }
    
    残留物-= lRetVal;
    offset += lRetVal;
    //表示请求的长度小于实际有效载荷
    如果(残留物< 0)
    {
    UART_PRINT ("错误:len <有效载荷\n");
    继续;
    }
    }
    if (lRetVal < 1)//表示来自 while 循环的无效中断
    {
    继续;
    }
    }
    
    
    UART_PRINT ("\n\n"r);
    
    /*删除最后一个 CR 或 LF 字符*/
    ATCommands_cmdBuffer[offset - 1]='\0';
    
    ATCmd_send (ATCommands_cmdBuffer);
    }
    返回(0);
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Nick!

    实际上、它看起来像是您的代码应该修复的错误。
    如果可以、请告诉我。

    BR、
    Kobi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好 Kobi

    这适用于我在 VB.NET 中编写的终端程序、我在其中使用 AT+SendTo=

    但是当我使用 CC3220MOD 将代码加载到我的产品上时,CC3220MOD 不会响应第一个 AT+SendTo=,系统会再次发送该代码,并 以错误消息:命令不存在,0进行响应

    我还在研究这个问题。

    此致

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    命令无法正常工作。 但我真的不需要修改消息的剩余部分。 当我使用+Sendto 时、我已经对我的数据进行了编码、所以一直在0x80和0xFF 之间。

    对于.pem 文件、这将不起作用、但我更改了 AT 演示、以便它使用0x04 (EOT)传输结束作为接收到的消息终结器。 .pem 文件永远不包含 EOT 字符。 除了在我的另一个帖子中出现 AT 文件系统命令问题外、此操作一直正常。
    Nick
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Nick、

    我们将在其中一个即将发布的版本中提供完整的修复程序。
    同时,似乎一切都可以处理"AT_Command.c"(它是应用程序代码的一部分)中"ATCommands_readCmd()"的命令特定修复程序。

    BR、
    Kobi