翼度科技»论坛 编程开发 .net 查看内容

物联网浏览器(IoTBrowser)-顶尖OS2电子秤协议实现

11

主题

11

帖子

33

积分

新手上路

Rank: 1

积分
33
本教程基于  物联网浏览器(IoTBrowser)-Web串口自定义开发 ,详细的过程可以翻看之前的文章。
本篇以实现顶尖OS2系列电子秤协议对接,并集成到IoTBrowser平台。由于没有找到OS2协议的官方文档,用串口助手抓包分析了一下,简单封装了一下实现代码有点潦草。
所有的串口或者需要实时数据同步的业务都可以集成ComBase类,重量数据采集是典型的实时推送场景,由于电子秤基本只需要推送重量,需要往串口写数据,所以不需要实现发送数据接口。
代码如下:
  1. using DDS.IoT.Com;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO.Ports;
  5. using System.Linq;
  6. using System.Runtime.InteropServices;
  7. using System.Text;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. namespace DDS.IoT.DJ
  11. {
  12.     public class Os2Driver : ComBase
  13.     {
  14.         public override string Type => "DJ_Os2";
  15.         public override string Name => "顶尖OS2";
  16.         /// <summary>
  17.         /// 最近一次重量
  18.         /// </summary>
  19.         private string _lastValue = string.Empty;
  20.         private object _locker = new object();
  21.         public override bool Init(int port, int baudRate = 9600, string extendData = null)
  22.         {
  23.             if (SP == null)
  24.             {
  25.                 this.Port = port;
  26.                 var portName = "COM" + port;
  27.                 SP = new SerialPort(portName);
  28.                 base.PortName = portName;
  29.                 SP.BaudRate = baudRate;
  30.                 SP.Parity = System.IO.Ports.Parity.None;
  31.                 SP.DataBits = 8;
  32.                 SP.StopBits = System.IO.Ports.StopBits.One;
  33.                 //SP.DtrEnable = true;
  34.                 //SP.RtsEnable = true;
  35.                 SP.DataReceived += SP_DataReceived;
  36.                 Console.WriteLine("初始化Os2驱动程序成功!");
  37.             }
  38.             return true;
  39.         }
  40.         private void SP_DataReceived(object sender, SerialDataReceivedEventArgs e)
  41.         {
  42.             try
  43.             {
  44.                 lock (_locker)
  45.                 {
  46.                     if (false == SP.IsOpen) return;
  47.                     int bytesRead = SP.BytesToRead;//获取接收缓冲区中数据的字节数
  48.                     if (bytesRead < 16)
  49.                     {
  50.                         return;
  51.                     }
  52.                     byte[] bytesData = new byte[16];
  53.                     //var strData = "1,2,83,45,48,48,46,48,49,56,107,103,101,3,4,0";
  54.                     SP.Read(bytesData, 0, 16);
  55.                     if (bytesData[0] != 0x01)
  56.                     {
  57.                         SP.DiscardInBuffer();
  58.                         return;
  59.                     }
  60.                     List<byte> buffer = new List<byte>();
  61.                     buffer.AddRange(bytesData);
  62.                     SP.DiscardInBuffer();
  63.                     var weight = ConvertWeight(buffer);
  64.                     // 验证数据是否有效,且与上一次数据不一致
  65.                     if (weight != this.Data)
  66.                     {
  67.                         if (this.OnPushData != null)
  68.                         {
  69.                             this.OnPushData(this.Id,weight);// 触发事件
  70.                             this.Data = weight;
  71.                         }
  72.                     }
  73.                 }
  74.             }
  75.             catch (Exception ex)
  76.             {
  77.                 Console.WriteLine("串口操作失败:" + ex.Message);
  78.             }
  79.         }
  80.         /// <summary>
  81.         /// Os2称重数据--读取字节为十进制数据 0x为十六进制
  82.         /// </summary>
  83.         /// <param name="byteFrame">帧数据(两位wn+8位数据带小数点+kg+两个固定字节回车换行)</param>
  84.         private float ConvertWeight(List<byte> byteFrame)
  85.         {
  86.             float value = 0f;
  87.             if (byteFrame == null || byteFrame.Count == 0)
  88.             {
  89.                 return value;
  90.             }
  91.             if (true)
  92.             {
  93.                 byte[] byteData = new byte[9];
  94.                 byteFrame.CopyTo(3, byteData, 0, 9);
  95.                 string weightData = Encoding.ASCII.GetString(byteData).Replace("kg", "").Replace("g", "");
  96.                 value = float.Parse(weightData);
  97.             }
  98.             return value;
  99.         }
  100.         public bool Opened = false;
  101.         public override event PushData OnPushData;
  102.         public override bool Open()
  103.         {
  104.             var b = false;
  105.             try
  106.             {
  107.                 if (!Opened)
  108.                     SP.Open();
  109.                 b = true;
  110.                 Opened = true;
  111.             }
  112.             catch (Exception ex)
  113.             {
  114.                 string msg = string.Format("Os2串口打开失败:{0} ", ex.Message);
  115.                 Console.WriteLine(msg);
  116.             }
  117.             return b;
  118.         }
  119.         public override bool Close()
  120.         {
  121.             if (SP.IsOpen)
  122.                 SP.Close();
  123.             Opened = false;
  124.             OnPushData = null;
  125.             return true;
  126.         }
  127.     }
  128. }
复制代码
同样,先需要本地测试,所以需要在main方法中编写测试代码。
  1.         static void Main(string[] args)
  2.         {
  3.             var ok = false;
  4.             do
  5.             {
  6.                 Os2Driver driver = new Os2Driver();
  7.                 driver.OnPushData += OnPushData;
  8.                 Console.Write("请输入串口号:");
  9.                 var port = Convert.ToInt32(Console.ReadLine());
  10.                 ok=driver.Init(port);
  11.                 ok = driver.Open();
  12.                 if(ok)
  13.                     Console.Write("打开成功,重量监听中...");
  14.             } while (!ok);
  15.             Console.ReadLine();
  16.         }
  17.         private static void OnPushData(string id, dynamic weight)
  18.         {
  19.             Console.WriteLine(DateTime.Now.ToString()+ ":" + weight);
  20.         }
复制代码
本地编译,拷贝到Plugins/Com文件夹下,在IoTBrowser中将驱动型号改为DJ_Os2,串口号根据实际情况填写即可。
 
示例代码:
https://gitee.com/yizhuqing/IoTBrowser/tree/master/Plugins/DDS.IoT.DJ

联系方式:微信 billy_yi  QQ: 909501683出处:http://yizhuqing.cnblogs.com/    多年.NET平台开发经验,擅长物联网各类设备(地磅、轨道秤、RFID等)集成开发。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
来源:https://www.cnblogs.com/yizhuqing/p/17988086
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
来自手机

举报 回复 使用道具