c#串行数据-格式化接收的数据字符串后丢失数据

本文关键字:数据 字符串 格式化 | 更新日期: 2023-09-27 18:15:27

我的项目是一个客户显示,通过串行连接连接到餐厅POS(基于pc的收银机)。我使用的是c#, Visual Studio 2010。

当收银员接受顾客的订单并将商品输入POS系统时,POS通过串口发送格式化文本字符串。我需要采取该文本和解析它,以删除一些不需要的字符,格式化它,并显示在屏幕上。

大多数情况下,一切都如第一张图所示(注意,我在右侧有未格式化的原始数据以供参考)。每次都将其添加到列表框中,并在添加或删除每个新项目后(如果进行了订单更正)更新税收和总额。

问题:当POS快速发送几个项目时,有些东西会分崩离析,而不是所有的文本都被正确处理/格式化/放置在屏幕上。如第二张图所示。

你可以看到几个项目"滑过",并显示项目代码。

当我以任何方式格式化输入的字符串时(在测试中),所有数据似乎都能准确地显示在屏幕上。所以在我看来,处理字符串的正在导致问题,串行数据不断进入,有些被丢弃。我试过了所有的握手方式。

第一个代码是我现在使用的,第二个代码是我在构建单独的事件处理程序时使用的示例。这两种方法都有同样的问题。

代码:

private void OnDataReceived(object sender, System.EventArgs e)
    {
        RxString = (myPortController.Read());
        RxString = RxString.TrimStart(new char[] { (char)02 }); // trim the Char02 so I can test for the 'Clear Screen' signal
        if (RxString == "")
        {
        }
        else RxString = RxString.Remove(RxString.Length - 1, 1); // Trim the end of line ascii character (dont need it for list box)
        if (RxString.StartsWith("C"))  // this is the 'Clear Screen' signal.  ClearAll is a simple func. to remove text from all controls
        {                              // to clear the screen after each order.
            ClearAll();
        }
        else  // Next sections display the text on screen, testing for Tax, Total or if not, then its a regular Menu Item
            if (RxString.Contains("Tax"))
            {
                labelTax.Text = RxString.Remove(0, 5);
            }
            else
                if (RxString.Contains("Total"))
                {
                    labelTotal.Text = RxString.Remove(0, 5);
                }
                else
                    if (RxString == "")
                        RxString = "";  // just do nothing with an empty string (dont know better way of ignoring that)
                    else
                    {
                        listOrderItems.Items.Add((RxString.Remove(0, 5)));  // Add the main menu items to the Listbox
                    }
     }

方法使用单独的事件句柄,但得到相同的结果:

  private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        RxString = serialPort1.ReadExisting();
        this.Invoke(new EventHandler(DisplayText));
    }

c#串行数据-格式化接收的数据字符串后丢失数据

那里有大量的信息需要了解,我不完全确定您提供的信息是否足以帮助我们解决这个特定的问题。因此,我将提出一种自己解决这个问题的方法(以及一种给So社区更好的问题的方法),而不是一个明确的解决方案。

探索测试驱动的开发,并使用您已经完全测试过的组件构建您的OnDataReceived事件处理程序。处理程序的核心部分是文本处理,您可以轻松地使用另一个类来完成。看起来你把一次性工作的代码当成了福音(可能碰巧还有一些代码)。

获取一些简单的文本字符串并构建类来解析它们并返回适当的数据。在此基础上,用更大的字符串、取消的项等构建更复杂的测试用例。一旦您对自己的测试感到满意,就可以在硬件上进行一些测试,看看它是如何工作的。如果它失败了,你有更多的测试用例要添加。

然后……起泡,冲洗,重复。