连接串口后先发送"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. Oracle单表去重复(一)

    去重有两层含义,一:是记录完全一样:二:是符合一定条件的认为是重复. 根据表的数量,去重可划分为:单表去重和多表关联去重.   对于去重,一般最容易想到的是用distinct,而distinct只能对 ...

  2. nyoj A+B Problem IV

    A+B Problem IV 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这 ...

  3. 记 TP-Link 路由器的 WDS 设置

    记 TP-Link 路由器的 WDS 设置 有一台旧的 TP-Link 路由器,是以前朋友送的,外壳看起来还不错,也挺新的. 本来已经有一台极路由了,看到信号还是不够好,所以想使用 TP-Link 的 ...

  4. spring的定时任务配置(注解)

    参考博客: http://www.jb51.net/article/110541.htm http://blog.csdn.net/wxwzy738/article/details/25158787 ...

  5. unittest框架出报告乱码的问题解决

    跟着上面的步骤修改好后,unittest断言写法要写成下面这样才能展示非乱码

  6. Appium使用ID进行定位

      1 使用uiautomatorviewer地获取元素ID 路径:sdk\tools\uiautomatorviewer.bat 2 脚本中增加点击事件 driver.find_element_by ...

  7. 精《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #5 使用checkpatch.pl检查补丁的格式

    HACK #5 使用checkpatch.pl检查补丁的格式 本节介绍发布前检查补丁格式的方法.Linux内核是由多个开发者进行开发的.因此,为了保持补丁评估与源代码的可读性,按照统一的规则进行编写是 ...

  8. 学习记录:CONCAT()

    连接多个字符串 SELECT * from t_info where phone = CONCAT('12345','678900')

  9. VBS 创建快捷方式

    Dim Shell,DesktopPath,link Set Shell = CreateObject("WScript.Shell") DesktopPath = Shell.S ...

  10. win7局域网内共享文件夹及安全设置

    右键想要共享的文件夹,选择属性. 在文件夹属性对话框中选择共享标签,如图: 点击共享按钮,弹出文件共享对话框. 添加 Everyone ,并根据实际需要修改权限.权限可以是读取 或 读取/写入. 到此 ...