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.

[参考译文] MSP430AFE253:显示电压等的串行通信协议出现问题 (中文协议- DL/T645)

Guru**** 2575725 points
Other Parts Discussed in Thread: MSP430AFE253

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/596641/msp430afe253-issue-with-serial-communication-protocol-to-show-the-voltage-and-etc-chinese-protocol---dl-t645

器件型号:MSP430AFE253

这是 MSP430AFE253的测试报告。

www.ti.com/.../slaa488.pdf

在本文档的第22页、我们将看到"GUI Read Out Metering Parameter"、也就是说、通过发送6100、您将从能量计中接收到第一阶段信息。

我已经使用 Win32 Console 应用程序编写了一个代码。 以读取/写入串行端口。 6100或技术上61十六进制和00十六进制是我需要向仪表发送的数字、对吧? 但由于某些原因、我的仪表没有响应!

我有什么问题吗?

另一方面、GUI (由以下链接提供)会从所有阶段获取所有电压:0x61 0x62 0x63。  

  www.ti.com/.../slaa488.zip

因此、这告诉我、我没有向串行端口发送正确的字符、可能缺少其他字符!

请提供建议吗?

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

    我将查看您的问题、并将很快作出答复。

    此致、

    James

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

    谢谢 James、

    这里是我根据 pdf 文件发送的内容、更加具体和详细。

    char lpBuffer[15]={0x68、0x99、0x99、0x99、0x99、0x99、0x99、0x68、0x23、0x06、0x61、0x00、0x01、0x00、0x16};

    在仪表中、我只能看到最后一个字符(0x16)

    我相信这里一定会有一些东西缺失!

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

    您好!

    感谢您提供更多详细信息、尤其是您尝试发送的确切数据包。

    首先、查看 SLAA488测试报告 文档、nr/W (通知命令方向)字节似乎存在差异。 在第21页的 A.2节中、0x80表示从 GUI 到 F4481的命令、0x00表示 F4481反馈到 GUI。 但是、在第22页的 A.2.1节中、从 GUI 到 F4481的命令使用0x00、从 F4481到 GUI 的命令使用0x80。 也许这个字节表示下一个命令将来自哪里、而不是来自当前命令? 我不确定、因为我没有用于测试此情况的硬件。

    由于您要将此命令从 PC 发送到 F4481、我看到您使用的是0x00。 我认为这不是主要问题、但您可以尝试改用0x80、看看它是否起作用。 如果确实如此、我需要提交反馈、以便相应地更新文档。

    更重要的是、我认为还有另外两个问题阻碍了此命令正常工作。

    1. 首先、当您仅发送一个数据字节0x01时、将长度字节设置为0x06。 尝试将长度字节更改为0x01。
    2. 接下来、您已将 CS (校验和)字节设置为0x00。 该字节等于 Packet_Body 的算法和(从0到 len+9)。 在这里、校验和将在 H_CMD 字节(0x61)、nR/W 字节(0x00或0x80、请参阅上面我对此的评论)和数据字节(0x00)之间计算。 尝试将 CS 字节更改为校验和。

    也许、您可以在 UART 线路上放置一个逻辑分析仪来嗅探来自 GUI 的数据包的外观。

    希望这对您有所帮助。

    此致、

    James

    MSP 客户应用

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

    到目前为止、我已根据您所说的内容更正了阵列。

    char lpBuffer[15]={0x68、0x99、0x99、0x99、0x99、0x99、0x99、0x68、0x23、0x01、0x61、0x80、0x01、0x00、0x16};

    但是、我没有获取校验和部分。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请告知数据和总和吗?

    H CMD:0x61  电压相位1
    NR/W:如您所说、为0x80
    数据:???
    总和:??
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您为我键入整个数组、您会介意吗? 我完全困惑!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我强烈建议您在线搜索 DL/T645多功能电表通信协议文档。 它详细讨论了协议结构和框架。 在浏览这些内容之后、我发现0x00表示主器件到从器件的方向、0x80表示从器件到主器件的方向。 现在、让我们将 nr/W 字节保持为0x00。

    现在、在 Packet_Body 字段中的所有字节上计算校验和。 基本而言、校验和是所有字节的总和、然后是 mod 乘以256。 那么、让我们尝试这个数据包。

    char lpBuffer[14]={0x68、0x99、0x99、0x99、0x99、0x99、0x99、0x68、0x23、0x02、0x61、0x00、0x61、0x16};

    我从以前的中删除了单个数据字节0x01、这似乎没有必要。 此外、我将长度字节更改为0x02、因为我们使用的是 H_CMD 和 nr/W 字节。 最后、对于 CS 字节、(0x61 + 0x00) mod 256等于0x61。

    编辑:校验和(CS)字节等于从帧起始字节到最后一个数据字节的所有字节的总和、然后将此结果修改为0x100 (256)。 请参阅下一页上的我的答案、了解完整的说明。

    此致、

    James

    MSP 客户应用

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

    James、

    我搜索了很多关于这种中国协议的信息。 只有两个源可用。 一个是 TI、另一个是中文网站。 但不幸的是、没有一个好的示例。

    我将在星期二测试您的代码。因为我现在不在工作、我们很遗憾地关闭了3天! 感谢你的帮助。 我对此表示赞赏。 要抓住真正了解这一点的人并不容易。 我将确保您能随时了解最新信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1年前、我使用了能源库代码并对其进行了重建、以查看是否可以为 GUI 重新创建可执行文件、从而使用 Cygwin 进行开发。 一个文件中的更改失败、同时需要对其他文件进行更改、这确实令人困惑。 毕竟、dlt645是了解其工作原理的神秘协议。 希望我能给您带来好消息!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="James Evans"]
    char lpBuffer[14]={0x68、0x99、0x99、0x99、0x99、0x99、0x99、0x68、0x23、0x02、0x61、0x00、0x61、0x16};[/引号]

    James、

    我刚刚测试了您的代码、遗憾的是它没有用任何字符返回给我!

    0x61应提供相位1读数。

    您还建议我尝试其他什么?  

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

    James、

    您能为我澄清一下吗?

    有些东西我不理解。 当您在固件中发送"123"时、我只能在代码中放入断点时看到最后一个字符。

    我猜我可能需要更改发送字符的方式?

    我完全困惑!

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

    我将查看您的最新反馈、并将很快做出响应。

    此致、

    James

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

    很遗憾听到我推荐的数据包无法正常工作。 由于我们已经提到了有关这一点的文档、我将假定数据包是正确的、但可能还有其他问题导致了这一问题。

    首先、您能否确认您使用的是9600波特率? 如果不是、我建议使用这种缓慢的数据速率。

    为了排除任何与 C++、时序等相关的问题、让我们尝试一个称为 串行端口实用程序的有用(免费)程序 、以将 DLT645数据包发送到 F4481器件。 它允许您轻松构建多字节数据包并通过终端接口发送它们。

    接下来,在第423行的 switch()语句的'emeter-dlt645.c'文件中放置一个断点。 如果您的代码在发送数据包后到达此点、这是一个良好的开始。 基本上、第423行正在检查接收到的命令、根据该命令、状态机将执行某些操作。 如果您发送了命令0x61 (host_CMD_GET_READING_PHASE_1)、我们希望代码执行第581行的"Send_AFE_READING (0)"函数。 如果此时运行代码,则可以检查"rx_msg->uint8[]"数组的内容。 请注意、'emeter-dlt645.c'文件的一些相关#defines 可在'emeter-dlt645.h'文件中找到、您可能已经知道这一点。

    如果您无法在代码中达到此点、则数据包可能会出错。 使用默认 GUI 时,甚至可以尝试达到这些断点,然后读取"rx_msg->uint8[]"数组以准确查看发送的内容。

    希望这能帮助您指明正确的方向。 让我知道您的发现、我们可以更深入地挖掘。

    此致、

    James

    MSP 客户应用

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

    詹姆斯!

    好消息! 尽管我仍然需要您的帮助。

    这是我所做的。 我使用了您的 SPU 程序并向仪表发送了一个字符、由于我没有您之前的建议数据包、我尝试了一个数据包、但没有收到任何内容。 然后运行 GUI 并意识到我的软件包如下所示。

    6899999999996823026400EF165916BC9AF0DE2B16

    然后、想知道为什么我的数据包这么长、并尝试按如下方式缩短。

    6899999999996823026400EF16

    即使这样、我也可以使用您的软件以及 C++版本的代码(格式不同)在屏幕上收到一些内容

    然后、我想知道为什么 GUI 使用了64命令、即 host_CMD_GET_CSG_NEUTRAL。 为什么不使用0x61获取 Phase_1信息?

    我尝试了:

    6899999999996823026100EF16  

    并对为什么将 EF 用作数据感到困惑!

    我还想知道为什么0x61、0x62或0x63不起作用?

    但我已经在 GUI 的表中填充了所有电压读数?

    那么、我如何要求仪表为我提供电压数据包、然后我就可以过滤和清理我收到的数据!

    对此有什么想法吗?

    我的解释对您来说足够清楚了吗?

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

    最后、我想知道了这一点。 对于0x61阶段 I、您需要发送以下数据包:

    char lpBuffer[80]={0x68、0x99、0x99、0x99、0x99、 0x99、0x99、0x68、0x23、0x02、 0x61、0x00、0xEC、0x16};

    和0x62

    char lpBuffer[80]={0x68、0x99、0x99、0x99、0x99、 0x99、0x99、0x68、0x23、0x02、 0x62、0x00、0xED、0x16};

    即使是我的 C++版本、我也能看到收到的消息、但我需要滤除我需要的十六进制电压、并将其转换为十进制。

    GUI 和断点非常有用。

    非常感谢您的有用回复。

    话虽如此、我们是否需要更改 DLT645的 pdf 文件、如所述之和。

    我仍然不明白为什么我有 EF ED EC?

    但我理解为什么我有2个字节的数据!

    0x02

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

    您好!

    很抱歉我迟到了,但我想回答你的最后一个问题。 首先、让我说我不正确地计算校验和。 根据 《MSP430AFE253中国国家电网规范测试报告》(SLAA488)中的附录 A.1、校验和(CS)字节等于帧中从0到 len+9的算法总和。 但是、该值只能是8位或1字节、因此 CS 等于 Mod 256 (0x100)之和。 在我的 PC 上以编程器模式使用计算器程序、我在最初计算校验和时输入的模数为0x256、而不是0x100、这给了我错误的结果。

    让我以您的第一个数据包为例、确保一切都有意义。

    char lpBuffer[80]={0x68、0x99、0x99、0x99、0x99、 0x99、0x99、0x68、0x23、0x02、 0x61、0x00、0xEC、0x16};

    总和=(0x68 + 0x99 + 0x99 + 0x99 + 0x99 + 0x99 + 0x99 + 0x68 + 0x23 + 0x02 + 0x61 + 0x00)= 0x4EC
    cs = SUM [MOD] 0x100 = 0x4EC [MOD] 0x100 = 0xEC

    对于数据字节、您答对了-这里有2个字节。 命令数据字段中的前2个字节是 CMPH 和 CMTL、用于定义命令和后面的参数。 在这里、CMPH 是命令字节(例如0x61)、CMTL 是通知命令方向字节(例如0x00)。

    希望这一切都是合理的、并消除了其他用户可能产生的任何混淆。

    此致、

    James

    MSP 客户应用