【问题标题】:Reading the Serial Port读取串口
【发布时间】:2013-07-20 22:19:14
【问题描述】:

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

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

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 次它可能会捕获一次 1超过10次

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

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

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

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

【问题讨论】:

  • 请删除注释掉的代码,除非确实需要。

标签: c# scale barcode-scanner


【解决方案1】:

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

你需要调试你的代码,设置一个断点和/或 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,你会想要更智能地构建它,例如:Alternative to writing many if statements?

【讨论】:

  • 我会像我说的那样尝试它会一直工作我没有重量而有重量它正在发送恒定数据并且它发送第一个响应的小翻转可能没有足够的时间或其他东西
  • 我尝试将它们全部设为 if,它的发生方式与我取出所有 comport.discards 并在最后只放一个的方式相同,但仍然是一样的,当然也让它有点架构一旦我让它正常工作就更聪明了哈哈
  • 我添加了我们讨论过的代码,仔细检查你的代码是否相同。继续记录输出并找出阻止条码扫描发生 1/10 的条件。也看看this,我想一旦你看到它就会很简单。森林里的树之类的东西..像狗一样追着骨头!条件断点,调试。打印所有已执行的#行代码号等
  • 我会试着看看我对数据扫描没有问题的建议,我曾经做过一次,直到我开始检查重量,它扫描得很好,就像我说扫描仪的响应很疯狂,没有例如,如果扫描仪写回 s143,则订购。这意味着它的重量为 0,它响应 s141。它正在计算重量,s145。没有重量或盘片被移除,s1440010。物品重 0.10 磅,在所有这些反应的迷雾中,当扫描秤时,不断有这样的反应 s143.s08AUPC。所以我可能需要找到一种方法来打破该响应或检查结束线是“\r”
  • 还有另一件可能感兴趣或令人头疼的事情,如果我将我的文本框设置为数据和它的内容,当我扫描它时显示的一瞬间不足以让我阅读它跨度>
【解决方案2】:
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 循环

【讨论】:

    猜你喜欢
    • 2013-09-24
    • 2017-07-23
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 2011-12-24
    • 1970-01-01
    相关资源
    最近更新 更多