拌合楼管理软件开发(十三) 对接耀华XK3190-A9地磅(实战篇)

前言: 实战开整

        目前而言对于整个拌合楼管理软件开发,因为公司对这个项目还处于讨论中,包括个人对其中的商业逻辑也存在一些质疑,都是在做一些技术上的储备.很早就写好了串口与地磅对接获取代码,也大概知道真个逻辑,这次刚好跟库区沟通,远程连接到磅房电脑,开始实操一下.


一、地磅对接数据逻辑分析:

        大多数地磅都是通过串口与电脑进行连接,所以编程实现的基本原理就是使用SerialPort来接收串口传过来的数据。从目前查到的一些文档分两种模式,一种是串口打开后,地磅会主动推送数据过来,这串数据包固定有开始符和结束符,16进制的模式。 第二种是需要主动去查询,目前我还没有碰到过这种地磅。

        耀华的这款地磅每帧数据由 12 组数据组成,第1位是02(开始位)  第12位是03 (结束位) ,这里务必注意如果要判断是否是开始位或者结束位, 使用的是16进制来判断.  最开始我直接字符串比较是否=="02",遇到了坑.  需要firstByte == 0x02

        第二位是符号位一般是 2B(+)和 2D(-) , 为什么会有负数,  因为有时候我们默认会有有毛重,比如实际重量10公斤, 净重就是0, 那么如果榜上重量低于10公斤,那么就是负数了.

        第3到第8位就是称重重量的数据了,第九位是小数位, 他用来标记小数点所在的位置.第10位为异或校验高四位,第11位为异或校验低四位, 这两位的作为用我到现在还没太明白.

        02 2D 30 30 30 30 36 30 30 31 42 03 

        以上就是我收到的一组地磅传过来的数据.称量的数据  16进制转换为ascii码为

30 30 30 30 36 30    =>  0 0 0 0 6 0 

         这个磅我初始化设置的小数点位在第三位,称重单位为吨,上面第九位小数位为0x30 =>0 那么组合起来数字就是000.060  对应数据位 0.06吨

二、代码的实现:

        1.  Form 界面如下: 一个下拉框选择com口, 两个按钮,一个textbox

        2.  定义类的属性       

   private string PortName;
   private SerialPort port = new SerialPort();
   private string _recv_string = "";

        PortName用来接收下拉选择的端口,  port 就是我们定义的SerialPort 类, 用来接收数据. 我印象中以前版本的.net  窗体,估计4之前,实际直接拖一个serialport组件到form窗体上的,就像textbox一样, .net 8 里面没有, 需要手工通过nuget 去下载 System.IO.Port

        3.   定义一个函数遍历电脑所有的port返回一个list        

  public static List<string> loadComPorts()
  {
      List<string> portsList = new List<string>();
      string[] ports = SerialPort.GetPortNames();
      if (ports != null)
          portsList = ports.ToList();
      return portsList;
  }

        4.  form1_load 时初始化下拉选择框       

 private void Form1_Load(object sender, EventArgs e)
 {
     comboBox1.DataSource = loadComPorts();
 }

     private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
     {
         PortName = comboBox1.Text;


     }

          3和4 不是必须得,如果只是测试完全可以知道地磅所接的是那个端口直接设置端口号了.

        5.  设置参数开启port监听.

 private void button1_Click(object sender, EventArgs e)
 {

     if (!port.IsOpen)
     {
         port.PortName = PortName;
         port.BaudRate = Convert.ToInt32("9600");
         port.DataBits = 8;
         port.Parity = Parity.None;
         port.StopBits = StopBits.One;
         port.ReceivedBytesThreshold = 1;
         try
         {
             port.Open();
             MessageBox.Show($"{PortName} 打开成功");
             port.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
         }
         catch (Exception ex)
         {
             MessageBox.Show(ex.Message);

         }
     }
 }

        这里有两个很关键的地方, 第一个  port.BaudRate  如果直接赋值 9600 会包参数错误, 没搞明白为什么会这样.  另外   port.ReceivedBytesThreshold = 1;    如果没有这一代码,  你会发现过很久才接收到一帧数据.   

   private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
   {
      
       _recv_string = "";
       int len = port.ReadBufferSize;
       byte[] bytesData = new byte[len];
       byte byteData;
       for (int i = 0; i < len - 1; i++)
       {

           byteData = Convert.ToByte(port.ReadByte());
           if (byteData == 0x03)
           {
               break;  
           }
           bytesData[i] = byteData;
           _recv_string += bytesData[i];   
       }
    //   _recv_string = Encoding.Default.GetString(bytesData);
      
       textBox1.Invoke(new EventHandler(delegate {
           textBox1.AppendText(Environment.NewLine);
           textBox1.AppendText( DateTime.Now.ToString("G") + " " + DateTime.Now.Microsecond + "|" + _recv_string ); }));

   }

        到此我们就把地磅数据接收出来了,并通过textbox不断地显示出来接收到的地磅数据. 地磅大概每100毫秒推送一次数据,textbox就会滚动显示, 这里我还碰到了一个坑.  如果使用     

  textbox1.text  = info + "\r\n"  +textbox1.text

       本意是将info的新内容附加到textbox1中,  但实际出来的显示效果是把textbox1中的内容覆盖掉只是显示最新的info. 需要通过 AppendText 来实现,  另外换行需要用到  Enviroment.NewLine ,用"\r\n" 不行.


总结:  核心功能完成

        到这里地磅读数已经完成了, 但还是留有一个小尾巴,  我们拿到的 _recv_string  还需要进一步解析为10进制的数据, 另外还有就是 地磅称重过程,数据会不停地变化,那么我们需要有个机制判断地磅是否已经稳定, 当前数据是否就应该是称重重量.  我考虑的逻辑是 如果经过 2s 或者 连续接收10次 数据都是一样,那么就判定磅的状态已经稳定, 可以对拿到的数据进行解析输出称重重量了.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/503662.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Sql注入---基础

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.Sql注入概述 攻击者通过构造恶意的SQL查询语句&#xff0c;将其注入到应用程序的数据库查询中&#xff0c;以执行未经授权的操作或者获取敏感信息。 假设如下场景&#xff0c;当你想要知道对…

双端队列的插入与删除操作的实现及其时间复杂度分析

双端队列(deque,全称为double-ended queue)是一种支持在两端插入和删除元素的数据结构。与栈和队列不同,双端队列提供了更加灵活的操作方式。在实现双端队列时,我们可以采用数组作为底层数据结构,以保证插入和删除操作的时间复杂度为O(1)。 一、双端队列的基本概念 双…

《QT实用小工具·四》屏幕拾色器

1、概述 源码放在文章末尾 该项目实现了屏幕拾色器的功能&#xff0c;可以根据鼠标指定的位置识别当前位置的颜色 项目功能包含&#xff1a; 鼠标按下实时采集鼠标处的颜色。 实时显示颜色值。 支持16进制格式和rgb格式。 实时显示预览颜色。 根据背景色自动计算合适的前景色…

Artplayer视频JSON解析播放器源码|支持弹幕|json数据模式

全开源Artplayer播放器视频解析源码&#xff0c;支持两种返回模式&#xff1a;网页播放模式、json数据模式&#xff0c;json数据模式支持限制ip每分钟访问次数UA限制key密钥&#xff0c;也可理解为防盗链 &#xff0c;本播放器带弹幕库。 运行环境 推荐使用PHP8.0 redis扩展…

【每日跟读】常用英语500句(400~500)

【每日跟读】常用英语500句 Where can I buy a ticket? 在哪里能买到票&#xff1f; When is the next train? 下趟火车什么时候到&#xff1f; Thank you so much for helping me move yesterday. 非常感谢你昨天帮我搬家 I’m feeling a little under the weather toda…

专升本-信息安全

信息安全&#xff1a; 1.信息安全的基本属性&#xff1a;保密性&#xff0c;完整性&#xff0c;可用性 信息本身的安全是指保证信息的保密性&#xff08;非授权用户不能访问信息&#xff09;&#xff0c;完整性&#xff08;信息正确&#xff0c;完整&#xff0c;违背篡改&…

从0开始搭建基于VUE的前端项目

准备与版本 安装nodejs(v20.11.1)安装vue脚手架(vue/cli 5.0.8) ,参考&#xff08;https://cli.vuejs.org/zh/&#xff09;vue版本&#xff08;2.7.16&#xff09;&#xff0c;vue2的最后一个版本 初始化项目 创建一个git项目&#xff08;可以去gitee/github上创建&#xff…

CVE-2023-4427:Out-of-bounds access in ReduceJSLoadPropertyWithEnumeratedKey

文章目录 前言环境搭建for-in && enum cache漏洞分析漏洞利用总结参考 前言 之前分析调试漏洞时&#xff0c;几乎都是对着别人的 poc/exp 调试&#xff0c;感觉对自己的提升不是很大&#xff0c;所以后面分析漏洞时尽可能全面分析&#xff0c;从漏洞产生原理、如何稳定…

亚马逊测评新策略:解决底层环境防关联,提升下单成功率

对于做测评的环境系统&#xff0c;确保稳定性和成功率是非常重要的。市面上有各种环境方案&#xff0c;如虚拟机、模拟机、gcs、云手机、VPS等。然而&#xff0c;这些方案不仅成本高&#xff0c;而且成功率很低。因此&#xff0c;一个好的环境系统是成功的基础。 亚马逊平台的…

zabbix分布式监控实战

zabbix分布式监控实战 架构 组件 zabbix-server&#xff1a;负责接收agent发送的数据 zabbix-agent&#xff1a;部署在被监控主机上&#xff0c;负责被监控主机的数据并将数据发送给zabbix-server zabbix-database&#xff1a;存储所有zabbix配置信息&#xff0c;监控数据 …

(C语言)fread与fwrite详解

1. fwrite函数详解 头文件&#xff1a;stdio.h 函数有4个参数&#xff0c;只适用于文件输出流 作用&#xff1b;将从ptr中拿count个大小为size字节的数据以二进制的方式写到文件流中。返回写入成功的数目。 演示 #include <stdio.h> int main() {FILE* pf fopen(&qu…

微信小程序如何进行npm导入组件

文章目录 目录 文章目录 前言 一、安装node 二、微信小程序通过npm安装组件&#xff08;以Vant-weapp为例&#xff09; 一、Vant-weapp下载 二 、修改 app.json 三 、修改 project.config.json 四 、 构建 npm 包 前言 微信小程序使用npm导入有很多的教程&#xff0c;我…

MySQL开窗函数

测试环境&#xff1a;mysql8.0.18 官方文档&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/window-functions.html 一、窗口函数介绍二、语法结构三、自定义窗口1.rows&#xff08;重点&#xff09;2.range3.默认窗口 四、常用窗口函数示例1.row_number & rank &…

书生·浦语训练营二期第一次笔记

文章目录 书生浦语大模型全链路开源体系视频笔记Intern2模型体系 训练数据集书生浦语全链条开源开放体系开放高质量语料数据预训练微调中立全面性能榜单大模型评测全栈工具链部署 书生浦语大模型全链路开源体系-Bilibili视频InternLM2技术报告&#xff08;中文&#xff09;Inte…

python多方式操作elasticsearch介绍

python多方式操作elasticsearch介绍 1. requests模块操作ES ​ requests 是一个 Python HTTP 库&#xff0c;它简化了发送 HTTP 请求和处理响应的过程。通过 requests 模块&#xff0c;开发人员可以轻松地与 Web 服务进行通信&#xff0c;包括获取网页内容、执行 API 请求等。…

【Docker】搭建安全可控的自定义通知推送服务 - Bark

【Docker】搭建安全可控的自定义通知推送服务 - Bark 前言 本教程基于绿联的NAS设备DX4600 Pro的docker功能进行搭建。 简介 Bark是一款为Apple设备用户设计的开源推送服务应用&#xff0c;它允许开发者、程序员以及一般用户将信息快速推送到他们自己的iPhone、iPad等设备上…

webGIS 之 智慧校园案例

1.引入资源创建地图 //index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&qu…

表单元素使用

表单元素使用 要完成的效果:代码实现: 要完成的效果: 代码实现: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

nginx与tomcat的区别?

关于nginx和tomcat的概念 网上有很多关于nginx和tomcat是什么东西的定义&#xff0c;我总结了一下: tomcat是Web服务器、HTTP服务器、应用服务器、Servlet容器、web容器。 Nginx是Web服务器、HTTP服务器、正向/反向代理服务器&#xff0c;。 这里有两个概念是交叉的&#xff…

DolphinScheduler on k8s 云原生部署实践

文章目录 前言利用Kubernetes技术云原生平台初始化迁移基于Argo CD添加GitOpsDolphinScheduler 在 k8s 上的服务自愈可观测性集成服务网格云原生工作流调度从HDFS升级到S3文件技术总结 前言 DolphinScheduler 的高效云原生部署模式&#xff0c;比原始部署模式节省了95%以上的人…