zoukankan      html  css  js  c++  java
  • T31P电子秤数据读取

      连接串口后先发送"CP "激活电子秤数据发送,收到的数据包是17字节的

        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
    
        namespace DotNet.ElecScales
        {
    
            using System.IO.Ports;
            using System.Text;
            using System.Threading;
            /// <summary>
            /// 针对Defender 3000 - T31P
            /// 厂家:奥豪斯仪器(常州)有限公司
            /// 设置成 波特率9600, 8位无校验,连续模式
            /// 编写:Wdfrog
            /// http://www.cnblogs.com/wdfrog/archive/2012/10/25/2738257.html
            /// </summary>
            public class ElecScalesReader
            {
                #region 属性d定义
    
    
    
                private String ComName;
    
    
             
                private int C_MaxQueueElem = 30;//队列里存放的最多元素个数
                private int C_FrameLength = 17;
    
                private bool Enabled = false;
                private Thread WorkThread { get; set; }
    
    
    
                //公开属性
                public Queue<GatherDataInfo> DataQueue { get; private set; }
                public SerialPort COMPort { get; private set; }
                public Exception LastError { get; set; }
                #endregion
                /// <summary>
                /// 构造
                /// </summary>
                public ElecScalesReader(string com)
                {
                    ComName = com;
                    DataQueue = new Queue<GatherDataInfo>();
    
                }
                private void EnsureCOMPortOpen()
                {
                    if (COMPort == null)
                    {
                        //配置COMPort
                        COMPort = new SerialPort(ComName.ToUpper(), 9600, Parity.None, 8, StopBits.One);
                        COMPort.Handshake = Handshake.XOnXOff;
                        COMPort.Encoding = Encoding.ASCII;
                        //COMPort.DtrEnable = true;
                    }
                    if (!COMPort.IsOpen)
                    {
                        COMPort.Open();
                    }
                }
    
                /// <summary>
                /// 格式-> 状态,读数,原始数据Ascii字符串,备注
                /// 状态-> 1:成功,0:无数据,4:错误
                /// </summary>
                /// <returns></returns>
                public string GetValue()
                {
    
                    string valueTmp = "{0},{1},[{2}],{3}";//状态{1成功,0无数据,4错误},读数,原始数据16进制表示,备注
                    var data = GetValueInfo();
                    return string.Format(valueTmp, data.Status, data.StrValue, data.RawStr == null ? "" : data.RawStr, "");
    
    
                }
                public GatherDataInfo GetValueInfo()
                {
                   
                    try
                    {
                        if (WorkThread == null || WorkThread.IsAlive != true)
                        {
                            Launch();
                            Thread.Sleep(100);
                        }
                    }
                    catch (Exception ex)
                    {
                        LastError = ex;
                        return new GatherDataInfo() { Status = 0 };
                    }
    
                    if (DataQueue.Count <= 0) Thread.Sleep(100);
                    GatherDataInfo data = new GatherDataInfo() { Status = 0, AddTime = DateTime.Now, RawStr = null, StrValue = Thread.CurrentThread.ManagedThreadId.ToString() + ":" + this.GetHashCode().ToString(), };
                    lock (DataQueue)
                    {
                        if (DataQueue.Count > 0)
                        {
                            data = DataQueue.Last();
                        }
                    }
                    return data;
                }
                /// <summary>
                /// 关闭COM
                /// </summary>
                public void Close()
                {
                    this.Enabled = false;
                    while (COMPort != null && COMPort.IsOpen) Thread.Sleep(10);
    
                }
    
                /// <summary>
                /// 启动
                /// </summary>
                private void Launch()
                {
                    EnsureCOMPortOpen();
                    Enabled = true;
    
                    WorkThread = new Thread(DoReceive);
                    WorkThread.IsBackground = true;
                    WorkThread.Priority = ThreadPriority.Highest;
                    WorkThread.Start();
    
                }
                private void DoReceive()
                {
                    Console.WriteLine("ThreadId:" + Thread.CurrentThread.ManagedThreadId.ToString());
                    #region
                    try
                    {
                        byte[] buffer = new byte[COMPort.ReadBufferSize];
                        while (Enabled)
                        {
    
                            Thread.Sleep(100);
                            if (COMPort.BytesToRead <= 0) continue;
    
                            var readLine= COMPort.ReadLine();
                            if (readLine.Length != 17) continue;
                            
                            var v = readLine.Substring(0, 1).Trim() + readLine.Substring(1, 7).Trim();
                            COMPort.DiscardInBuffer();
    
                            Console.WriteLine(v);
                            //将数据入队列
                            var data = new GatherDataInfo() { Status = 1, AddTime = DateTime.Now, RawStr = readLine, StrValue = v };
                            lock (DataQueue)
                            {
                                DataQueue.Enqueue(data);
                                if (DataQueue.Count > C_MaxQueueElem)
                                {
                                    DataQueue.Dequeue();
                                }
                            }
                       
    
    
    
                        }
                    }
                    catch (Exception ex)
                    {
                        LastError = ex;
                        throw;
                    }
                    finally
                    {
    
                        if (COMPort != null && COMPort.IsOpen)
                        {
                            COMPort.Close();
                        }
                    }
                    #endregion
    
                }
            }
    
    
    
    
            /// <summary>
            /// 获取的有效桢信息
            /// </summary>
            public class GatherDataInfo
            {
                public DateTime? AddTime { get; set; }
                /// <summary>
                /// 字节信息
                /// </summary>
                public String RawStr { get; set; }
                /// <summary>
                /// 转化后的信息
                /// </summary>
                public string StrValue { get; set; }
    
                /// <summary>
                /// 1,有效果
                /// 0,无效
                /// </summary>
                public int Status { get; set; }
            }
    
    
    
            public class ElecScalesHelper
            {
                private static Dictionary<String, ElecScalesReader> _Readers;
                public static Dictionary<String, ElecScalesReader> Readers
                {
                    get
                    {
    
                        if (_Readers == null)
                        {
    
                            _Readers = new  Dictionary<String,ElecScalesReader>();
    
                        }
    
                        return _Readers;
                    }
    
    
    
                }
                /// <summary>
                /// 格式-> 状态,读数,原始数据16进制表示,备注
                /// 状态-> 1:成功,0:无数据,4:错误
                /// </summary>
                /// <returns></returns>
                public static string GetValue(String comName)
                {
                    var com=comName.Trim().ToLower();
                    if (com.IndexOf("com") != 0) return "错误的COM名称";
    
                    lock (typeof(ElecScalesHelper))
                    {
    
                        ElecScalesReader reader = null;
                        if (!Readers.ContainsKey(com))
                        {
                            reader = new ElecScalesReader(com);
                            Readers.Add(com, reader);
                        }
                        else
                        {
                            reader = Readers[com];
                        }
                        return reader.GetValue();
                    }
    
                }
                /// <summary>
                /// 关闭COM
                /// </summary>
                public static string Close(String comName)
                {
                    var com = comName.Trim().ToLower();
                    if (!Readers.ContainsKey(com)) return "字典内不存在该串口";
                    var reader = Readers[com];
    
                    lock (typeof(ElecScalesHelper))
                    {
                        reader.Close();
                        reader = null;
                    }
                    return "";
                }
            }
    
    
    
        }
    View Code
  • 相关阅读:
    ueditor 后端配置项没有正常加载,上传插件不能正常使用 UTF8 PHP
    dedecms 后台栏目全部展开 包括三级栏目
    修改DedeCMS图片上传路径命名规则的具体方法步骤
    dedecms织梦副栏目名称和链接调用
    当位于顶级栏目显示下级栏目,当位于二级栏目显示同级栏目,当位于三级目录,显示上级栏目
    织梦多个栏目arclist调用副栏目不显示的解决办法
    PL/SQL连接64位Oracle配置方法
    U盘分区之后如何恢复
    Myeclipse 的使用随笔
    eclipse和myeclipse的差别问题
  • 原文地址:https://www.cnblogs.com/wdfrog/p/3867850.html
Copyright © 2011-2022 走看看