经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » 浏览器 » 查看文章
物联网浏览器(IoTBrowser)-顶尖OS2电子秤协议实现
来源:cnblogs  作者:木子清  时间:2024/1/26 10:04:23  对本文有异议

本教程基于  物联网浏览器(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

原文链接:https://www.cnblogs.com/yizhuqing/p/17988086

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号