如何从体重秤中获得稳定的结果?

How to get a stable result from a weighting scale?

我有一个项目,我必须将称重机的输出接收到计算机中,然后缓存在我的软件中。

这款秤的品牌是fairbank秤

型号:70-2455-4w/431

手册:perkinsscale.com/files/benchscales/manual1.pdf

根据我上面列出的手册,我从秤中检索数据的想法是将十六进制代码发送到秤并获取它响应的信息。我已经有一个代码来接收输出,但我一直没有得到准确的结果。有时我得到 t运行 的结果。例如,它没有显示 150.15 LB,而是显示 15 Lb 或 .15 LB。此外,有时我无法从中接收到任何数据。它只会给我一个空白的结果。我需要的是,每当我 运行 代码时,它都会 return 我在体重秤上显示的数字完全相同。我使用的代码如下:

谁能帮帮我?

using System;
using System.IO.Ports;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Text;
using System.Windows;
using System.Data.SqlClient;
using System.Collections;
using System.Threading;

namespace PortDataReceived
{
    class PortData
    {
        public static void Main(string[] args)
        {
            try
            {
                char CarriageReturn = (char)0x0D;
                string final =  CarriageReturn.ToString(); 
                SerialPort mySerialPort = new SerialPort("COM3");
                mySerialPort.BaudRate = 9600;
                mySerialPort.Parity = Parity.Odd;
                mySerialPort.StopBits = StopBits.Two;
                mySerialPort.Encoding = System.Text.Encoding.GetEncoding(1252);
                mySerialPort.DataBits = 7;
                mySerialPort.Handshake = Handshake.None;
                mySerialPort.ReadTimeout = 12000;
                mySerialPort.WriteTimeout = 5000;
                mySerialPort.DtrEnable = true;
                mySerialPort.RtsEnable = true;
                while (true)
                {
                    mySerialPort.Open();
                    mySerialPort.Write(final+"\r\n");
                    mySerialPort.DataReceived += new
                       SerialDataReceivedEventHandler(DataReceivedHandler);
                    Console.WriteLine("Press any key to continue...");
                    Console.WriteLine();
                    Console.ReadKey();
                }
                mySerialPort.Close();
            }
            catch (System.IO.IOException e)
            {
                if (e.Source != null)
                    Console.WriteLine("IOException source: {0}", e.Source);
                throw;
            }
        }

        private static void DataReceivedHandler(
                            object sender,
                            SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();
            int i = sp.BytesToRead;
            indata = " " + indata + " ";
            if((indata.IndexOf(" "+"kg"+" ")>=0)||(indata.IndexOf(" "+"lb"+" ")>=0))
            {
                 Console.WriteLine("Data Received:");
                 Console.Write(indata);
                 Console.ReadKey();
            }
        }
    }
}

重新阅读您的设备手册

按如下方式构建代码:

有一个用于接收字节的专用字节缓冲区。

每当串口发送东西时,将其添加到缓冲区。

如果缓冲区包含 'end of transmission' 个字符(例如换行符),则解析缓冲区的内容。

我不会为这里的 DataReceived 事件操心。您正在发送命令以获取读数,然后您可以通过调用 ReadLine 等待结果。所以我会这样做:

mySerialPort.Open();    // Note: you don't need to keep opening the port!
while(true) {
    mySerialPort.Write(final);    // You didn't need the \n\r here either
    var reading = mySerialPort.ReadLine();
    // Do whatever processing you need to to extract an actual value
    Console.WriteLine("Press any key to continue...");
    Console.WriteLine();
    Console.ReadKey();  
}