连接串口后先发送"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. mysql having,group by查询去除重复记录

    http://m.jb51.net/article/39302.htm 可以这样去理解group by和聚合函数 http://www.cnblogs.com/wuguanglei/p/4229938 ...

  2. html css 怎么使img和a标签在一个行内元素中间对齐

    答案是:#box ul.games li img{vertical-align: middle;} 这行很重要哦. <div id="box"> <div cla ...

  3. Spring4中@value用法详解

    版本:spring-framework-4.1 一.概述 为了简化读取properties文件中的配置值,Spring支持@Value注解的方式来获取,这种方式大大简化了项目的配置,业务中也提高了灵活 ...

  4. php fwrite写入文件bom头导致的乱码问题解决

    最近导出文件遇到fwrite导出乱码,而且中英文都乱码,很费解.折腾了一番之后终于找到问题所在了,mark下. UTF-8 BOM 又叫 UTF-8 签名,其实 UTF-8 的 BOM 对 UFT-8 ...

  5. 解决移动端H5海报滑动插件适应大部分手机问题 手机端高度自适应

    Html5微信端滑屏海报在各种尺寸的手机上总会有这样那样的问题,经过多次制作总结出来一些小心得,分享下. 我使用的是jquery插件swiper.min.js,动画可以利用animate.css,如果 ...

  6. WinCE全屏手写输入法

    来源地址:http://www.dwhand.com/?page_id=570 WinCE全屏手写输入法 功能特点: 1.支持手写识别,智能拼音.仓颉.注音.笔画.五笔.ABC等输入模式. 2.支持各 ...

  7. linux 线程的同步 三 (内存信号量的使用)

    信号量.同步这些名词在进程间通信时就已经说过,在这里它们的意思是相同的,只不过是同步的对象不同而已.但是下面介绍的信号量的接口是用于线程的信号量,注意不要跟用于进程间通信的信号量混淆,关于用于进程间通 ...

  8. android studio安装须知

    64位linux,默认会提示mksdcard错误什么的,需要安装一个库 sudo apt- android sdk的下载,自己找代理服务器吧,哎……

  9. redis 操作大全 PHP-redis中文文档

    转自  : http://www.cnblogs.com/weafer/archive/2011/09/21/2184059.html phpredis是php的一个扩展,效率是相当高有链表排序功能, ...

  10. 汇编_指令_JMP

    JMP指令 JMP是汇编语言中的无条件跳转指令.无条件跳转指令可转到内存中任何程序段.转移地址可在指令中给出,也可以在寄存器中给出,或在储存器中指出. 中文名:无条件跳转指令 外文名:JMP 和调用指 ...