拌合楼管理软件开发(十三) 对接耀华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次 数据都是一样,那么就判定磅的状态已经稳定, 可以对拿到的数据进行解析输出称重重量了.
相关文章:

拌合楼管理软件开发(十三) 对接耀华XK3190-A9地磅(实战篇)
前言: 实战开整 目前而言对于整个拌合楼管理软件开发,因为公司对这个项目还处于讨论中,包括个人对其中的商业逻辑也存在一些质疑,都是在做一些技术上的储备.很早就写好了串口与地磅对接获取代码,也大概知道真个逻辑,这次刚好跟库区沟通,远程连接到磅房电脑,开始实操一下. 一、地…...
FastAPI+React全栈开发10 MongoDB聚合查询
Chapter02 Setting Up the Document Store with MongoDB 10 Aggregation framework FastAPIReact全栈开发10 MongoDB聚合查询 In the following pages, we will try to provide a brief introducton to the MongoDB aggregation framework, what it is, what benefits it of…...
python 报错问题汇总
error: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: d:\\anaconda\\envs\\yolov5\\lib\\site-packages\\ISR-2.2.0-py3.7.egg 解决方法:重启pycharm python-contrib 无法安装 opencv-contrib-python 安装包网址:安装包下载链接…...

6.5物联网RK3399项目开发实录-驱动开发之LCD显示屏使用(wulianjishu666)
90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】 链接:https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwdc53f LCD使用 简介 AIO-3399J开发板外置了两个LCD屏接口,一个是EDP,一个是LVDS,接口对应板…...

「Android高级工程师」BAT大厂面试基础题集合-下-Github标星6-5K
C、 com.android.provider.contact D、 com.android.provider.contacts 11.下面关于ContentProvider描述错误的是()。 A、 ContentProvider可以暴露数据 B、 ContentProvider用于实现跨程序共享数据 C、 ContentProvider不是四大组件 D、 ContentP…...
【算法】基数排序
简介 基数排序(*Radix sort)是一种非比较排序算法(non-comparative sorting algorithm)。现代计算机的基数排序算法由 计数排序 算法的开发人哈罗德H西华德(Harold H. Seward)于1954年于麻省理工大学开发。…...

2核2G服务器优惠价格轻量61元一年,CVM价格313元15个月
腾讯云2核2G服务器多少钱一年?轻量服务器61元一年,CVM 2核2G S5服务器313.2元15个月,轻量2核2G3M带宽、40系统盘,云服务器CVM S5实例是2核2G、50G系统盘。腾讯云2核2G服务器优惠活动 txybk.com/go/txy 链接打开如下图:…...

不同Python版本和wxPython版本用pyinstaller打包文件大小对比
1、确定wxPython和Python版本的对应关系 在这里可以找到Python支持的所有wxPython版本:https://pypi.tuna.tsinghua.edu.cn/simple/wxpython/ 由于Python从3.6版本开始支持f字符串、从3.9版本开始不支持Windows7操作系统,所以我仅筛选3.6-3.8之间的版本…...

【C语言】结构体详解(一)
目录 1、什么是结构体? 2、结构体成分 3、结构体变量的定义与初始化 3.1、结构体变量的三种定义方式 3.2、结构体变量的初始化 4、结构体成员的访问(两种方式) 4.1、直接访问 4.2、间接访问 5、结构的特殊声明 5.1、不完全声明(匿…...

AI时代-普通人的AI绘画工具对比(Midjouney与Stable Diffusion)
AI时代-普通人的AI绘画工具对比(Midjouney与Stable Diffusion) 前言1、基础对比Stable Diffusion(SD)SD界面安装与使用SD Midjouney(MJ) 2、硬件与运行要求对比Stable Diffusion硬件要求内存硬盘显卡 Midjo…...

【蓝桥杯】矩阵快速幂
一.快速幂概述 1.引例 1)题目描述: 求A^B的最后三位数表示的整数,A^B表示:A的B次方。 2)思路: 一般的思路是:求出A的B次幂,再取结果的最后三位数。但是由于计算机能够表示的数字…...

C语言使用STM32开发板手搓高端家居洗衣机
目录 概要 成品效果 背景概述 1.开发环境 2.主要传感器。 技术细节 1. 用户如何知道选择了何种功能 2.启动后如何进行洗衣 3.如何将洗衣机状态上传至服务器并通过APP查看 4.洗衣过程、可燃气检测、OLED屏显示、服务器通信如何并发进行 小结 概要 本文章主要是讲解如…...

【Hello,PyQt】QTextEdit和QSplider
PyQt5 是一个强大的Python库,用于创建图形用户界面(GUI)。其中,QTextEdit 控件作为一个灵活多用的组件,常用于显示和编辑多行文本内容,支持丰富的格式设置和文本操作功能。另外,QSlider 控件是一…...
【力扣】191.位 1 的个数、485.最大连续 1 的个数
191.位 1 的个数 题目描述 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中 设置位 的个数(也被称为汉明重量)。 示例 1: 输入:n 11 输出࿱…...

蓝桥杯 java 承压计算
题目: 思路: 1:其中的数字代表金属块的重量(计量单位较大) 说明每个数字后面不一定有多少个0 2:假设每块原料的重量都十分精确地平均落在下方的两个金属块上,最后,所有的金属块的重量都严格精确地平分落在最底层的电子…...
leetcode268-Missing Number
这道题目要求缺失的数字,一般解决数组的问题,要么往排序数组,要么往双指针遍历这些方向上靠,要么往异或方向上靠,总之落点无非就只有这几个。我们要求缺失的数字,可以依次让1~n和数组元素进行异…...

【jenkins+cmake+svn管理c++项目】jenkins回传文件到svn(windows)
书接上文:创建一个项目 在经过cmakemsbuild顺利生成动态库之后,考虑到我一个项目可能会生成多个动态库,它们分散在build内的不同文件夹,我希望能将它们收拢到一个文件夹下,并将其回传到svn。 一、动态库移位—cmake实…...

数据结构·二叉树(2)
目录 1 堆的概念 2 堆的实现 2.1 堆的初始化和销毁 2.2 获取堆顶数据和堆的判空 2.3 堆的向上调整算法 2.4 堆的向下调整算法 2.4 堆的插入 2.5 删除堆顶数据 2.6 建堆 3 建堆的时间复杂度 3.1 向上建堆的时间复杂度 3.2向下建堆的时间复杂度 4 堆的排序 前言&…...
MATLAB算法实战应用案例精讲-【毕业季论文专用】人工智能视觉检测技术及其在实际应用中的挑战与前景
目录 摘要: 第一章:引言 1.1 研究背景 1.2 研究目的与意义...

Linux虚拟机环境搭建spark
Linux环境搭建Spark分为两个版本,分别是Scala版本和Python版本。 一、 安装Pyspark 本环境以 Python 环境为例。 1、下载spark 下载网址:https://archive.apache.org/dist/spark 下载安装包:根据自己环境选择合适版本,本环境…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...

认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...

论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...

云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...