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.

[参考译文] IWR1642BOOST:通过 UART 发送时校验和错误或数据丢失

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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/779019/iwr1642boost-wrong-checksum-or-data-loss-while-sending-through-uart

器件型号:IWR1642BOOST

您好!

我正在使用 SDK 2.0.0.4和它2.4.0进行人数统计演示。 我在 MATLAB 上接收数据、发现有时标头校验和不会生成为零。 它会导致我的应用程序崩溃。 我已经打印了类似这样的标头值

标头=[2 1 4 3 6 5 8 7 4 0 2 66 22 10 0 172 48 53 47 10 5 0 66 93 1 0 0 0 0 0 78 0 0 0 27 74 0 164 1 0 182 52 0 0 3 0 163 148] 

标题对我来说似乎是正确的、但如果发现校验和不等于零、应用程序在4-5秒后会中断。 我正在使用以下代码检查校验和

h = typecast (uint8 (标头)、'uint16');
a = uint32 (sum (h));
b = uint16 (sum (typecast (a、'uint16')));
CS = uint16 (bitcmp (b)); 

对于上面的标头、它将生成3个校验和。 尽管如此、标题在 我看来是正确的。 我还打印 了标题的解码值、如下所示

同步报头包括:258、772、1286、1800
版本:33554436
平台661058
时间戳792015020
封装长度1290
帧编号89410
子帧编号0
线性调频脉冲裕量78
帧裕量18971
uartSentTime 420 TrackTime
13494
numTL3
校验和38051

此外、通过 UART 接收数据时、数据似乎会丢失。 UART 波特率为921600。 需要专家的建议。  

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

    更新:

    我发现大部分时间校验和都在生成3或768。 我刚才发现的另一个奇怪的行为是错误的标头产生了零校验和。 52字节数据后产生零校验和。

    标头=[0 187 219 189 110 232 123 190 85 116 110 65 116 81 17 189 90 187 219 189 128 81 17 189 1 146 72 63 223 34 155 64 18 0 0 144 31 199 190 246 65 2 63 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0]; 

    我使用大小为52字节的滑动窗口和1字节幻灯片、以了解 UART 异步时有效字节流的起始位置。 但是,我的方法似乎并不是百分之百的愚蠢。 现在、我有两个问题

    1. 为什么产生错误的 CRC?
    2. 如何检查有效字节流的开始? 即、UART 应在获得 有效的52字节标头后立即开始处理。

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

    你好,拉克斯米,

    您可以在 task_mbox.c 的267行或 main_pplcount_viz.m 的1164行看到校验和创建过程。

    步骤如下:

    1. 将拼写从 uint8更改为 uint16。 如果数组[a b]中有两个 uint8值 a 和 b、则 uint16版本将为 BA。 (器件中的小端字节序、这也是 MATLAB 处理拼写时的方式)。
    2. 将所有新 uint16值求和并存储在 uint32中以避免溢出。
    3. 将 uint32和拆分为2 uint16、并将它们相加。
    4. 对从上一步中获得的总和取按位补码。

    由于您显示的示例代码是 MATLAB 的摘录、我认为您的技术不是问题、因此您似乎正在执行上述步骤。

    从您显示的标头数据中、您似乎没有找到魔术编号。  标头将始终以8字节幻数开头、这在 MATLAB 中看起来是如此[2 1 4 3 6 5 8 7]。  要查找报头的开头、您需要扫描 UART 数据以找到该神奇字。  然后、将魔术字作为标头的一部分、并计算校验和。  

    此致、

    Justin

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

    您好 Justin、

    是的、我执行的校验和与 TI 建议的完全相同。 它是相同的代码。 我认为我已经理解了问题第2点的答案、但第1点仍未得到回答。

    1. 您可以看到、帧头包含幻数、即使校验和不等于零、帧头也会立即显示出来。 我认为正在发生数据丢失 、UART 无法发送和接收这大量数据。 您是否有任何建议将20个样本减少到每秒2到4个样本?  

    此外、我还在 tast_mbox.c 中寻求修改该线路的呼叫频率的建议

    Semaphore_pend (gMmwMssMCB.mboxSemHandle、BIOS_WAIT_FOREVE);
    

    有时、我会 使标头同步、但有时会失去同步。 一旦代码丢失 同步、它将再次进入同步查找模式。 您能不能深入了解一下。

     

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

    你好,拉克斯米,

    请执行以下操作-通过增加帧周期来降低器件的帧速率:

    帧配置0 1 128 0 200 1 0

    跟踪配置1 2 250 20 200  90

    这会将每个帧设置为200ms、因此您将达到5fps。  使用这些设置运行演示、以确定较低的帧速率是否会解决数据损坏的问题。 如果这可以解决此问题、您可以在发送 TLV 之前检查帧编号。 您可以决定每4或5帧发送一次、以减少 UART 上的负载。  如果是这种情况、如果您使用默认 GUI、我仍然建议在每帧中发送一个帧头、因为它希望按顺序查看帧。

    此致、

    Justin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Justin。 我将检查并更新给您。 谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Justin、
    我还需要更改 cfarCfg 吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,拉克斯米,

    CFARCfg 还包含50、这是巧合。 您无需更改它。

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

    谢谢 Justin。 将为您提供最新信息。

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

    您是否仍需要有关此问题的支持?

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

    您好 Justin、

    我发现我在接收端遇到问题 感谢你的帮助。

x 出现错误。请重试或与管理员联系。