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));
}
那里有大量的信息需要了解,我不完全确定您提供的信息是否足以帮助我们解决这个特定的问题。因此,我将提出一种自己解决这个问题的方法(以及一种给So社区更好的问题的方法),而不是一个明确的解决方案。
探索测试驱动的开发,并使用您已经完全测试过的组件构建您的OnDataReceived
事件处理程序。处理程序的核心部分是文本处理,您可以轻松地使用另一个类来完成。看起来你把一次性工作的代码当成了福音(可能碰巧还有一些代码)。
获取一些简单的文本字符串并构建类来解析它们并返回适当的数据。在此基础上,用更大的字符串、取消的项等构建更复杂的测试用例。一旦您对自己的测试感到满意,就可以在硬件上进行一些测试,看看它是如何工作的。如果它失败了,你有更多的测试用例要添加。
然后……起泡,冲洗,重复。