【问题标题】:Serial port read string串口读取字符串
【发布时间】:2012-12-21 05:10:30
【问题描述】:

我有一个读取称重机的串口应用程序。

    public void Read()
    {
        while (Puerto.BytesToRead > 0)
        {
            try
            {
                string inputData = Puerto.ReadExisting();
                dataReceived = inputData;
            }
            catch (TimeoutException) { }
        }
    }

返回字符串是这样的

它还有其他额外的字符,我该如何解析或从中获取干净的数据?我只需要 0.52lb

【问题讨论】:

    标签: c# serial-port


    【解决方案1】:

    我不知道它是什么称重机以及它的串口规格是什么,但是,如果它对你来说也是黑匣子,请检查以下内容: - 检查您是否有解释 RS232 端口输出的技术规范 - 用一个样本权重做几个(10?)个样本,看看是否每次传递的字节数 - 如果您看到字节数是恒定的(除非 0.52lb 文本偶尔变为 0.5lb 的差异),那么重量后面的垃圾很可能是额外的二进制数据。 - 如果没有,并且您每次都看到具有精确偏移的权重(文本),您就可以抓取输出

    这是完全的逆向工程,我建议遵循技术规范并进行更有洞察力的数据处理。

    【讨论】:

    • 你是对的,其他数据是二进制数据,现在我的问题是如何处理它。我不是串行端口通信方面的专家。在该数据中有一个状态标志,我怎样才能提取这些字节,然后每个咬?
    • 提取字节很简单。以二进制形式从端口中读取流并解析其中有趣的部分。关键是您确定数据的结构。如果您决心进行逆向工程,则必须观察所有可能的重量样本情况并观察大小和格式。就这些字节的含义而言,猜测可能不是最好的方法,也没有推荐的方法。跟随您的直觉查看示例数据 - 在其上使用二进制和文本可视化工具。
    • TKS 有兴趣帮助我。已经有了结构,现在我正在处理最后 3 个字节,它们是像 10000001 这样的咬合标志,我该如何从一个字节中提取这些咬合?
    • C#(看起来就是你正在使用的)支持位运算,请参阅linklinklink 了解详细信息。至于10000001,见下图:const byte WEIGHMENTFLAG1 = 0x80;常量字节 WEIGHMENTFLAG2 = 0x01;公共静态无效Main(){字节_flags = 0x81; // 那是 10000001 Console.WriteLine("FLAG1 is: " + ((_flags & WEIGHMENTFLAG1) != 0)); }
    【解决方案2】:

    这可能是任何问题 - 称重机中的错误、某种硬件问题或串行端口的配置问题。我怀疑是配置问题。确保所有设置都正确(波特率、握手、奇偶校验、停止位)。另外,尝试使用另一个程序连接到同一个串口设备(例如,参见http://helpdeskgeek.com/windows-7/windows-7-hyperterminal/),看看是否看到相同的垃圾数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多