读取串行端口

本文关键字:串行端口 读取 | 更新日期: 2023-09-27 18:24:00

我有一个问题,涉及串行端口的读取方式和代码的处理方式。

我正在使用的设备是一个扫描仪/秤,我正在让我的程序显示恒定的重量,并扫描条形码

comport.NewLine = "'r";
comport.Write("S14'r");
while (comport.BytesToRead > 0)
{
    data = comport.ReadLine();
    if (data.StartsWith("S08"))
    {
        try
        {
            string data1 = data.Substring(4);
            data1 = data1.Trim();
            textBox1.Clear();
            textBox1.AppendText(data1);
            timer3.Stop();
            scan();
            timer3.Start();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
        comport.DiscardInBuffer();
    }
    else if (data.StartsWith("S144"))
    {
        if (data == "S1440000")
        {
            label8.Text = "0.00";
        }
        else
        {
            string data3 = data.Substring(4);
            data3 = data3.Trim();
            var data4 = data3.Insert(2, ".");
            string data5 = double.Parse(data4).ToString("F", CultureInfo.GetCultureInfo("en-US"));
            label8.Text = data5;
            comport.DiscardInBuffer();
        }
    }
    else if (data == "S143")
    {
        label8.Text = "0.00";
    }
    else if(data =="S145")
    {
        label8.Text = "- - - - -";
    }
    else if(data == "S141")
    {
        label8.Text = "- - - - -";
    }
}

这将不断显示重量,只要没有重量,它就会扫描条形码,我试图弄清楚为什么当有重量时它不会扫描,请注意,如果我扫描7次,它可能会在10次中捕获一次

编辑好了,我现在知道为什么它没有通过,它只在从扫描仪接收到的数据中第一个时处理upc,但我不知道如何正确排序,我观察了数据是如何混合的,它是如何以多种方式混合的

有时我会从扫描仪收到这个

S143.S08A07166200024。有时S1440050.S08A0716620024。有时S08A0716620024.S143.

有人对我应该如何阅读这篇文章有什么建议吗?这样,无论数据的接收顺序如何,我所有的if语句都会触发?

读取串行端口

我想弄清楚为什么当有重量的时候它不会扫描,注意,如果我扫描7次,它可能会在10次中捕获1次

您需要调试代码,设置一个断点&或Debug.Print(data)语句,查看为什么十次中只有一次满足第一个if条件:

if (comport.BytesToRead > 0)
{
if (data.StartsWith("S08"))
    {
        textBox1.Text = data.Substring(4).Trim();
        timer3.Stop();
        scan();
        timer3.Start();
    }
if (data.StartsWith("S144"))
    {
        if (data == "S1440000")
        {
            label8.Text = "0.00";
        }
        else
        {
            string data3 = data.Substring(4);
            data3 = data3.Trim();
            var data4 = data3.Insert(2, ".");
            string data5 = double.Parse(data4).ToString("F", CultureInfo.GetCultureInfo("en-US"));
            label8.Text = data5;
        }
    }
if (data == "S143")
    {
        label8.Text = "0.00";
    }
if (data =="S145")
    {
        label8.Text = "- - - - -";
    }
 if (data == "S141")
    {
        label8.Text = "- - - - -";
    }
    comport.DiscardInBuffer();
}

编辑:

有人对我该如何阅读这篇文章有什么建议吗因此,无论数据的顺序如何,我所有的if语句都会触发收到了吗?

不要让他们成为else if。使每一个都有自己的if。显然,如果有大量的if,你会想把它构建得更智能一点,例如:替代编写许多if语句?

comport.NewLine = "'r";
comport.Write("S14'r");
while (comport.BytesToRead > 0)
{
    data = comport.ReadLine();
if (data.StartsWith("S08"))
{
    try
    {
        string data1 = data.Substring(4);
        data1 = data1.Trim();
        textBox1.Clear();
        textBox1.AppendText(data1);
        timer3.Stop();
        scan();
        timer3.Start();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
    comport.DiscardInBuffer();
}
else if (data.StartsWith("S144"))
{
    if (data == "S1440000")
    {
        label8.Text = "0.00";
    }
    else
    {
        string data3 = data.Substring(4);
        data3 = data3.Trim();
        var data4 = data3.Insert(2, ".");
        string data5 = double.Parse(data4).ToString("F", CultureInfo.GetCultureInfo("en-US"));
        label8.Text = data5;
        comport.DiscardInBuffer();
    }
}
else if (data == "S143")
{
    label8.Text = "0.00";
}
else if(data =="S145")
{
    label8.Text = "- - - - -";
}
else if(data == "S141")
{
    label8.Text = "- - - - -";
}
}

将我的if更改为while循环