连接串口后先发送"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. 便捷的Jenkins jswidgets

    很多时候我们在构建完成之后需要查看构建的状态,类似github 中的build Status 插件安装 搜索插件 使用 目前好像只支持自由项目的构建 代码集成 <!DOCTYPE html> ...

  2. windows7下安装python环境和django

    1.安装python 1.1.首先访问http://www.python.org/download/去下载最新的python版本. 根据计算机位数选择对应的版本比如我的机器是64位的,我就下载这个安装 ...

  3. ASP.NET MVC基础入门.

    一:ASP.NET MVC 简介 1:asp.net mvc 是一种构建web应用程序的框架,他将一般的MVC(Model--View--Controller)模式应用于asp.net框架. 2:as ...

  4. PhpStorm 10.0.3 下载安装与汉化

    https://www.7down.com/soft/229568.html 2JA97R55MG-eyJsaWNlbnNlSWQiOiIySkE5N1I1NU1HIiwibGljZW5zZWVOYW ...

  5. ExtJs 扩展类CheckColumn的使用(事件触发)

    [javascript] view plain copy print? 使用 Extjs 在进行数据库编程经常会遇到 checkbox 的问题(奇怪网上却没有此类文章不知道其他人是怎么解决的,在此贴上 ...

  6. mysql-11元数据

    我的mysql是用docker配置的,服务器状态和服务器配置变量都未设置,报错正常.

  7. 微信JS接口汇总及使用详解

    这篇文章主要介绍了微信JS接口汇总及使用详解,十分的全面.详尽,包含分享到朋友圈,分享给朋友,分享到QQ,拍照或从手机相册中选图,识别音频并返回识别结果,使用微信内置地图查看位置等接口,有需要的小伙伴 ...

  8. Oracle 级联with admin option 和 with grant option

    · 授权通过grant 语法:GRANT object_priv[(columns)][ON object] TO {user|role|public} [WITH GRANT OPTION] · 回 ...

  9. phpcms模块开发中的小问题及解决方法

    1.模块菜单中文名出错 在编写安装模块时候可能需要更改extention.inc.php中定义中文名称,由于反复安装或者通过phpcms的扩展->菜单管理 修改菜单名会导致中文名失败.解决办法很 ...

  10. 基础html和css知识

    No1.HTML 1.网页结构 网页结构一般都包含文档声明DOCTYPE,并且在head中的meta应该包含编码格式.关键字.网页描述信息.简单格式如下: <!DOCTYPE html> ...