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

时间:2015-01-15 15:30:19

标签: c# serial-port

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

这种规模的品牌是费尔班克规模

模型:70-2455-4w / 431。

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

根据我上面列出的手册,我从规模中检索数据的想法是发送和十六进制代码到规模并获取它响应的信息。我已经有了一个接收输出的代码,但我一直都没有得到完整的结果。有时我得到截断的结果。例如,它没有显示150.15 LB,而是显示15 Lb或.15 LB.而且,有时我无法从中接收任何数据。它只会显示一个空白的结果。我需要的是,无论何时我运行代码,它都会返回我在规模上显示的相同数字。我使用的代码如下:

任何人都可以帮助我吗?

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();
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

重读设备手册

按如下方式构建代码:

为接收的字节设置专用字节缓冲区。

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

如果缓冲区包含传输结束'字符(例如换行符)解析缓冲区的内容。

答案 1 :(得分:0)

我不会在这里讨论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();  
}