IWR1642 Boost Linux下people count demo的串口数据读取错误率高达10-20%

Other Parts Discussed in Thread: IWR1642, IWR1642BOOST

Hi TI,

使用IWR1642 Boost (502AC),在Linux(c/c++编写的people count程序)下进行数据读取时,发现错误率高达10-20%,也就是每读5-10帧数据,就会出现一次不同步的情况;需要重新同步后才能成功读取到正确数据。效率很低。对比Windows 10 + Matlab程序,运行几分钟都未出现一次不同步的情况。

不确定是不是对串口的设置以及读取方式不完全正确造成的。能否提供一套完整、高效的Linux C/C++ people count应用程序代码(包括对串口的设置、读取方式)?

谢谢!

  • 你好,
    请参考ROS下的driver。
    协议类似,但不完全一致,你可以做相应对比测试。
    dev.ti.com/.../

    谢谢
  • 你好,
    我看了ROS driver下的源码,它对IWR1642的访问使用了ROS的库,包括serial::Serial定义,以及串口的配置、读写过程。我的代码里没有用ROS,无法参考这种用法。有仅使用Linux下通用库的应用程序代码吗?

    谢谢!
  • 你好,
    不好意思,暂时还没有。
    另外即是可参考visualizer的matlab代码做数据提取。
    谢谢
  • matlab用的也是它自己的一套函数。
    好吧,谢谢。
  • 回到这个问题本身,为什么会出现读了几帧数据后,就出现数据错误?可能丢了一些字节。对串口的读取是否要加流控?
  • 你好,
    你这边是串口读取有问题还是解析有问题?
    另外,QT版本的C++读写代码可参考以下demo的GUI,数据格式略有不同。
    dev.ti.com/.../
  • 解析的时候出错。frame header读出来之后,解析后面的某个tlv时出错。比如:
    readFrame, synced: 1
    sync: 506660481457717506
    version: 33554436
    platform: 661058
    timestamp: 734536900
    packetLength: 1626
    frameNumber: 5395
    subframeNumber: 0
    chirpMargin: 78
    frameMargin: 18678
    uartSentTime: 368
    trackProcessTime: 18839
    numTLVs: 3
    checksum: 55123
    got frame: 5395, TLV num: 3
    tlvHeader length: 1336, tlvHeader type: 6, tlvHeader size: 8, bodyOffset: 0, bodySize: 1574
    tlvHeader length: 188818104, tlvHeader type: 1061037589, tlvHeader size: 8, bodyOffset: 1336, bodySize: 1574
    unsynced: tlvHeader length error.

    tlvHeader length: 188818104,以及tlvHeader type: 1061037589 都出错了。但前面读取的数据还是正确的,中间可能漏掉一些字节,导致后面的解析就错位了。
  • 正常情况下,读取数据log如下:
    readFrame, synced: 1
    sync: 506660481457717506
    version: 33554436
    platform: 661058
    timestamp: 724568946
    packetLength: 1678
    frameNumber: 5394
    subframeNumber: 0
    chirpMargin: 78
    frameMargin: 18705
    uartSentTime: 475
    trackProcessTime: 19490
    numTLVs: 3
    checksum: 60921
    got frame: 5394, TLV num: 3
    tlvHeader length: 1384, tlvHeader type: 6, tlvHeader size: 8, bodyOffset: 0, bodySize: 1626
    tlvHeader length: 144, tlvHeader type: 7, tlvHeader size: 8, bodyOffset: 1384, bodySize: 1626
    tlvHeader length: 98, tlvHeader type: 8, tlvHeader size: 8, bodyOffset: 1528, bodySize: 1626
    readFrame success!
  • 建议你使用串口调试工具把串口传输的原始数据采集下来为文件
    在你的C code中,读取此文件进行debug。找出问题。
    谢谢。
  • 排查测试代码发现有个地方加了sleep,导致醒来后较大概率引起数据不同步。去掉sleep后,不同步的概率明显变小了,大概在1%左右。目前暂时可以接受这种错误率。

    谢谢回复。

  • 你好,我目前也想在Linux平台下读取IWR1642串口数据流,但Linux无法与IWR1642Boost进行窗口通信,一直无法识别串口,尝试过安装官方几个XDS110驱动,但始终无法识别软件。请问如何解决? 在Linux下运行官方QT的生命体征软件,一直提示Data Port didnt open。

  • 你好,我在linux平台上,用iwr1642boost链接电脑。生命体征案例可以成功的在Linux平台上运行,但是在写cfg命令的时候,提示QIODevice::Write(QSerialPort):device not open

  • 你好,我尝试Linux平台上和iwr1642设备进行串口通信,但无法写了cfg文件命令行。视乎是Linux下,无法识别串口。希望您可指导一下。TXQQ:1217332930. 你的问题在于代码的校验,与异常处理。目前我也在研究这个异常数据的处理。渴望沟通