通过 RS232 读取秤数据

问题描述

我想通过 RS232 从秤数据中读取数据,我尝试了更多方法

我的体重秤型号 yh-t7e datasheet

Accessport 程序上的刻度输出就是这个值。

output on Access Port

秤上的重量 = 3.900 公斤

图中 =009.300

波特率 1200

当我使用此代码

            string s = "";
            int num8 = 0;
            string RST = "";
            while (this.serialPort1.BytesToRead > 0)
            {
                string data = serialPort1.ReadExisting();
                if (data != null)
                {

                    if (data.ToString() != "")
                    {
                        if (data.Length > 6)
                        {
                            RST =  data.Substring(6,1) + data.Substring(5,1) + data.Substring(4,1) + data.Substring(3,1) + data.Substring(2,1);

                            this.textBox4110.Text = RST.ToString();
                        }
                    }
                }
            }

在我的程序中输出

当我在程序中使用上面的代码时 有时显示重量编号,有时不显示。我必须多次打开和关闭程序。 并且通过改变秤上的重量,程序上的数字不变,显示值固定。

当我使用此代码

 while (this.serialPort1.BytesToRead > 0)
{
int data = serialPort1.ReadByte();
 this.textBox4110.Text = data.ToString();
}

在我的程序中显示数字 48

我该怎么办?

谢谢

解决方法

我不知道为什么您的串行端口有时响应有时不响应。 我多年前用过 RS232,从来没有遇到过这个问题。

关于其他问题:

  • 您正在使用字节数组,无法调用 ToString,因为它会将字节 rappresentation 转换为字符串
  • 如果您必须反转咬合顺序 (4 - 3 - 2 - 1),您可以调用 Array.Reverse 方法

只是举个例子说明我的意思,我拿了你的代码:

while (this.serialPort1.BytesToRead > 0)
{
   int data = serialPort1.ReadByte();
   this.textBox4110.Text = data.ToString();
}

您的“数据”变量包含一个值为 48 的字节,它是 ASCII 表中的 0 个字符。 所以,如果你想要这个字符,你必须使用正确的编码来转换它。 假设您正在使用 UTF8:

while (this.serialPort1.BytesToRead > 0)
{
   var dataLen = this.serialPort1.BytesToRead; 
   var byteArray = new byte[dataLen];
   this.serialPort1.Read(byteArray,dataLen);
   var txt = Encoding.UTF8.GetString(byteArray);
   this.textBox4110.Text = txt;
}

老实说,我知道 Encoding.UTF8.GetString 接受一个字节数组,不确定它是否只适用于单个字节...