T31P电子秤数据读取
连接串口后先发送"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 = 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 ""; } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述