连接串口后先发送"CP\r\n"激活电子秤数据发送,收到的数据包是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 = ;//队列里存放的最多元素个数
private int C_FrameLength = ; 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(), , Parity.None, , 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();
}
}
catch (Exception ex)
{
LastError = ex;
return new GatherDataInfo() { Status = };
} if (DataQueue.Count <= ) Thread.Sleep();
GatherDataInfo data = new GatherDataInfo() { Status = , AddTime = DateTime.Now, RawStr = null, StrValue = Thread.CurrentThread.ManagedThreadId.ToString() + ":" + this.GetHashCode().ToString(), };
lock (DataQueue)
{
if (DataQueue.Count > )
{
data = DataQueue.Last();
}
}
return data;
}
/// <summary>
/// 关闭COM
/// </summary>
public void Close()
{
this.Enabled = false;
while (COMPort != null && COMPort.IsOpen) Thread.Sleep(); } /// <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();
if (COMPort.BytesToRead <= ) continue; var readLine= COMPort.ReadLine();
if (readLine.Length != ) continue; var v = readLine.Substring(, ).Trim() + readLine.Substring(, ).Trim();
COMPort.DiscardInBuffer(); Console.WriteLine(v);
//将数据入队列
var data = new GatherDataInfo() { Status = , 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") != ) 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 "";
}
} }

T31P电子秤数据读取的更多相关文章

  1. OleDbDataReader快速数据读取方式

    查询得到OleDbDataReader后,有三种方式支持数据读取,如下: //方法一**速度中等 OleDbDataReader reader = command.ExecuteReader(); w ...

  2. DataTable to Excel(使用NPOI、EPPlus将数据表中的数据读取到excel格式内存中)

    /// <summary> /// DataTable to Excel(将数据表中的数据读取到excel格式内存中) /// </summary> /// <param ...

  3. geotrellis使用(二)geotrellis-chatta-demo以及geotrellis框架数据读取方式初探

    在上篇博客(geotrellis使用初探)中简单介绍了geotrellis-chatta-demo的大致工作流程,但是有一个重要的问题就是此demo如何调取数据进行瓦片切割分析处理等并未说明,经过几天 ...

  4. GPS数据读取与处理

    GPS数据读取与处理 GPS模块简介 SiRF芯片在2004年发布的最新的第三代芯片SiRFstar III(GSW 3.0/3.1),使得民用GPS芯片在性能方面登上了一个顶峰,灵敏度比以前的产品大 ...

  5. 【原】Learning Spark (Python版) 学习笔记(二)----键值对、数据读取与保存、共享特性

    本来应该上周更新的,结果碰上五一,懒癌发作,就推迟了 = =.以后还是要按时完成任务.废话不多说,第四章-第六章主要讲了三个内容:键值对.数据读取与保存与Spark的两个共享特性(累加器和广播变量). ...

  6. MATLAB对于文本文件(txt)数据读取的技巧总结(经典中的经典)

    振动论坛原版主eight的经典贴http://www.chinavib.com/thread-45622-1-1.html MATLAB对于文本文件(txt)进行数据读取的技巧总结(经典中的经典)由于 ...

  7. TableInputFormat分片及分片数据读取源码级分析

    我们在MapReduce中TextInputFormat分片和读取分片数据源码级分析 这篇中以TextInputFormat为例讲解了InputFormat的分片过程以及RecordReader读取分 ...

  8. Extjs的数据读取器store和后台返回类型简单解析

    工作中用到了Extjs,从后台获取数据的时候,用到了extjs自己的Ext.data.store方法,然后封装了ExtGridReturn方法, 目的:前台用到Ext.data.store读取从后台传 ...

  9. Java学习-028-JSON 之二 -- 数据读取

    JSON数据由 JSONObject.JSONArray.key_value 组合而成.通常来说,JSONObject 可以包含 JSONObject.JSONArray.key_value:JSON ...

随机推荐

  1. Libusb学习

    1.参考:http://www.cnblogs.com/Daniel-G/archive/2013/04/22/3036730.html https://baike.so.com/doc/506541 ...

  2. purescript 基本试用

    安装环境 安装预编译文件 https://github.com/purescript/purescript/releases 配置环境变量: export PATH=$PATH:/Users/dalo ...

  3. HDFS 和 YARN 的 HA 故障切换【转】

    来源:https://blog.csdn.net/u011414200/article/details/50336735 一 非 HDFS HA 集群转换成 HA 集群二 HDFS 的 HA 自动切换 ...

  4. spring与hibernate注解及XML方式集成

    spring与hibernate注解及XML方式集成 Hibernate Xml方式 该种方式需要在sessionFactory中引入对应的hbm.xml文件,样例如下: <!-- spring ...

  5. winodws同步时间命令

    首先,你应该判断你的两台域控制器,哪一台担任PDC角色(默认的域内权威的时间服务源). 判断方法很简单,单击“开始”,单击“运行”,键入dsa.msc,然后点确定.这时会打开“Active Direc ...

  6. NLTK在自然语言处理

    nltk-data.zip 本文主要是总结最近学习的论文.书籍相关知识,主要是Natural Language Pracessing(自然语言处理,简称NLP)和Python挖掘维基百科Infobox ...

  7. 闲扯淡笔记 - Web的历史

    这里的Web指的是万维网,就是World Wide Web. 文档和静态资源 通过URL组织 Tim Berners Lee (TimBL) 于1989发明这个概念,这丫55年出生,和我父亲一般大. ...

  8. c# 设置自动隐藏任务栏、获取状态

    from: http://stackoverflow.com/questions/1381821/how-to-toggle-switch-windows-taskbar-from-show-to-a ...

  9. sdk下载地址

    http://www.androiddevtools.cn/ 容器,然后跟着下面的提示下载对应需要的包 放到对应的位置 即可

  10. SecureCRT 上传/下载文件到Linux服务器

    1. 安装上传/.下载软件 a) cd /tmp wget http://www.ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz tar zxvf lrzsz-0. ...