首页 > 其他分享 >物联网浏览器(IoTBrowser)-顶尖OS2电子秤协议实现

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

时间:2024-01-26 09:02:10浏览次数:35  
标签:SP Console string 电子秤 OS2 System return using IoTBrowser

本教程基于  物联网浏览器(IoTBrowser)-Web串口自定义开发 ,详细的过程可以翻看之前的文章。

本篇以实现顶尖OS2系列电子秤协议对接,并集成到IoTBrowser平台。由于没有找到OS2协议的官方文档,用串口助手抓包分析了一下,简单封装了一下实现代码有点潦草。

所有的串口或者需要实时数据同步的业务都可以集成ComBase类,重量数据采集是典型的实时推送场景,由于电子秤基本只需要推送重量,需要往串口写数据,所以不需要实现发送数据接口。

代码如下:

using DDS.IoT.Com;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace DDS.IoT.DJ
{
    public class Os2Driver : ComBase
    {
        public override string Type => "DJ_Os2";

        public override string Name => "顶尖OS2";

        /// <summary>
        /// 最近一次重量
        /// </summary>
        private string _lastValue = string.Empty;
        private object _locker = new object();

        public override bool Init(int port, int baudRate = 9600, string extendData = null)
        {
            if (SP == null)
            {
                this.Port = port;
                var portName = "COM" + port;
                SP = new SerialPort(portName);
                base.PortName = portName;
                SP.BaudRate = baudRate;
                SP.Parity = System.IO.Ports.Parity.None;
                SP.DataBits = 8;
                SP.StopBits = System.IO.Ports.StopBits.One;
                //SP.DtrEnable = true;
                //SP.RtsEnable = true;
                SP.DataReceived += SP_DataReceived;
                Console.WriteLine("初始化Os2驱动程序成功!");
            }
            return true;
        }

        private void SP_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                lock (_locker)
                {
                    if (false == SP.IsOpen) return;
                    int bytesRead = SP.BytesToRead;//获取接收缓冲区中数据的字节数
                    if (bytesRead < 16)
                    {
                        return;
                    }
                    byte[] bytesData = new byte[16];
                    //var strData = "1,2,83,45,48,48,46,48,49,56,107,103,101,3,4,0";
                    SP.Read(bytesData, 0, 16);
                    if (bytesData[0] != 0x01)
                    {
                        SP.DiscardInBuffer();
                        return;
                    }
                    List<byte> buffer = new List<byte>();
                    buffer.AddRange(bytesData);
                    SP.DiscardInBuffer();
                    var weight = ConvertWeight(buffer);
                    // 验证数据是否有效,且与上一次数据不一致
                    if (weight != this.Data)
                    {
                        if (this.OnPushData != null)
                        {
                            this.OnPushData(this.Id,weight);// 触发事件
                            this.Data = weight;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("串口操作失败:" + ex.Message);
            }
        }

        /// <summary>
        /// Os2称重数据--读取字节为十进制数据 0x为十六进制
        /// </summary>
        /// <param name="byteFrame">帧数据(两位wn+8位数据带小数点+kg+两个固定字节回车换行)</param>
        private float ConvertWeight(List<byte> byteFrame)
        {
            float value = 0f;
            if (byteFrame == null || byteFrame.Count == 0)
            {
                return value;
            }

            if (true)
            {
                byte[] byteData = new byte[9];
                byteFrame.CopyTo(3, byteData, 0, 9);
                string weightData = Encoding.ASCII.GetString(byteData).Replace("kg", "").Replace("g", "");
                value = float.Parse(weightData);
            }
            return value;
        }
        public bool Opened = false;

        public override event PushData OnPushData;

        public override bool Open()
        {
            var b = false;
            try
            {
                if (!Opened)
                    SP.Open();
                b = true;
                Opened = true;
            }
            catch (Exception ex)
            {

                string msg = string.Format("Os2串口打开失败:{0} ", ex.Message);
                Console.WriteLine(msg);
            }
            return b;
        }

        public override bool Close()
        {
            if (SP.IsOpen)
                SP.Close();
            Opened = false;
            OnPushData = null;
            return true;
        }


    }
}

同样,先需要本地测试,所以需要在main方法中编写测试代码。

        static void Main(string[] args)
        {
            var ok = false;
            do
            {
                Os2Driver driver = new Os2Driver();
                driver.OnPushData += OnPushData;
                Console.Write("请输入串口号:");
                var port = Convert.ToInt32(Console.ReadLine());
                ok=driver.Init(port);
                ok = driver.Open();
                if(ok)
                    Console.Write("打开成功,重量监听中...");
            } while (!ok);
            Console.ReadLine();
        }

        private static void OnPushData(string id, dynamic weight)
        {
            Console.WriteLine(DateTime.Now.ToString()+ ":" + weight);
        }

本地编译,拷贝到Plugins/Com文件夹下,在IoTBrowser中将驱动型号改为DJ_Os2,串口号根据实际情况填写即可。

 

示例代码:

https://gitee.com/yizhuqing/IoTBrowser/tree/master/Plugins/DDS.IoT.DJ

标签:SP,Console,string,电子秤,OS2,System,return,using,IoTBrowser
From: https://www.cnblogs.com/yizhuqing/p/17988086

相关文章

  • Err: http://packages.ros.org/ros2/ubuntu jammy InRelease Clearsigned file isn't
    问题描述Ubuntu22.04已安装ros2终端报错内容:jackie@MS-7E06:~/z_ws_ros2$sudoaptupdate[sudo]passwordforjackie:Get:1file:/var/cuda-repo-ubuntu2204-12-1-localInRelease[1,572B]Get:1file:/var/cuda-repo-ubuntu2204-12-1-localInRelease[1,572B]......
  • Ububtu 20.04.6 LTS 安装ROS2和Gazebo
    记录本人在Ububtu20.04.6LTS系统下安装ROS2和Gazebo的步骤,方便需要时查阅安装ROS2Foxy获取签名sudocurl-sSLhttps://raw.githubusercontent.com/ros/rosdistro/master/ros.key-o/usr/share/keyrings/ros-archive-keyring.gpg添加软件源以下指令二选一执行即可官方......
  • ROS2编程入门
    步骤:1.创建功能包;2.编辑源文件;3.编辑配置文件;4.编译;5.执行mkdir创建 colconbuild#编译一.创建功能包在终端创建C++功能包ros2pkgcreate<name>--build-typeament_cmake--dependenciesrclcpp--node-name<name>二.编辑源文件用vscode编写文件内容importrclp......
  • ROS2常用命令
    ROS2的主要命令入口是 ros2,其中又包含大量的子命令,可用于ROS2程序的开发和测试。下面是其中一些常用的命令及其作用:ros2run:运行ROS2节点或任意可执行文件。ros2run <package_name> <executable_name>ros2run<package_name><executable_name>--ros-args--para......
  • 吊钩电子秤方案主控芯片CSU8RP1185
    在生活中,买菜时常常出现缺斤少两的情况,这种情况多是商家秤有很大问题,往往消费者是最吃亏的,这种情况下,我们最好是带个吊钩电子秤,测量菜的重量,有问题直接拨打举报电话举报商家,使商家得到应有的惩罚。话说回来,重点在于吊钩电子秤,这种小型的电子秤,市面上有的生产商有很多,知名......
  • 电子秤芯片方案/吊钩秤主控CSU8RP1185
     在生活中,买菜时常常出现缺斤少两的情况,这种情况多是商家秤有很大问题,往往消费者是最吃亏的,这种情况下,我们最好是带个吊钩电子秤,测量菜的重量,有问题直接拨打举报电话举报商家,使商家得到应有的惩罚。 话说回来,重点在于吊钩电子秤,这种小型的电子秤,市面上有的生产商有很多,知名的......
  • 物联网浏览器(IoTBrowser)-简单介绍
    物联网浏览器(IoTBrowser)是用于开发人机界面(HMI)或数据采集与监督控制系统(SCADA)的工具,使用HTML或Vue前端技术开发物联网终端用户界面,支持串口、RFID、电子秤等硬件协议,支持js控制关机、全屏等工控操作。  一、示例功能展示1.窗口界面能力常用的功能界面全屏、设置......
  • 码农的转型之路-IoTBrowser(物联网浏览器)雏形上线
    消失了半个月闭门造轮子去了,最近干了几件大事:1.工控盒子,win10系统长时间跑物联网服务测试。运行快2周了,稳定性效果还满意,除了windows自动更新重启了一次。 2 .接触了一些新概念MQTT、HMI、SCADA,学习了几个物联网相关的开源项目IoTGateway、IoTSharp。在头条看到一个Web组态效......
  • 智能电子秤PCBA方案设计与开发
     人类生活节奏快、饮食不规律等现状使不少人体重猛增,过度肥胖会导致众所周知的“三高”问题,减肥、减肥已成为一个备受关注的大健康话题。人欲善其事必先利其器,要减肥自然也要有好伴侣,能同时测量体重和体脂的智能电子秤开始逐渐成为主流。 今天我们要说的就是关于智能电子秤PC......
  • 智能电子秤PCBA开发技术解决方案
    人类生活节奏快、饮食不规律等现状使不少人体重猛增,过度肥胖会导致众所周知的“三高”问题,减肥、减肥已成为一个备受关注的大健康话题。人欲善其事必先利其器,要减肥自然也要有好伴侣,能同时测量体重和体脂的智能电子秤开始逐渐成为主流。今天我们要说的就是关于智能电子秤......