基于C#的串口扫描枪通信实战

news2024/10/7 16:19:34

今天搞大事,观众们动起来,搞事的目的是

掌握串口通信及winform开发技术

硬件设备:1、串口激光扫描枪,注意是串口,不是USB口

 

 

                   2、USB转串口的连接线一根,如图连接所示

                  3、USB扩展器一个,如果你电脑USB口较多,可不用这个,如下图

                  4、香烟槟榔矿泉水,鸡腿等实物商品,用来扫的,用来点赞的

硬件连接拓扑图:

 软件环境:VS2019,C#,WINFORM

1、打开VS2019,创建窗体项目,命名为SerialPortScanner

 2、添加工具条,文本框控件,布局如下

 3、查看电脑设备管理器中的串口,并在app.config文件中添加配置项

 

 4、添加引入

 5、编写事件代码

 

 

 

 代码中用到SerialPortHelper帮助类,用于串口的初始化,接收事件,参数设置等,代码:

using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SerialPortScanner
{
    /// <summary>
    /// 串口帮助类
    /// </summary>
    public class SerialPortHelper
    {
        /// <summary>
        /// 定义委托
        /// </summary>
        /// <param name="info"></param>
        public delegate void ShowMesgDelegate(string info);
        /// <summary>
        /// 委托对象
        /// </summary>
        public ShowMesgDelegate myShowMsg;

        private SerialPort myCom = new SerialPort();//串口对象
        /// <summary>
        /// 串口属性
        /// </summary>
        public SerialPort MyCom
        {
            get
            {
                return myCom;
            }
            set
            {
                myCom = value;
            }
        }

        private byte myReceiveByte = 0;//接收字节
        private byte[] bData = new byte[1024];//接收的字节数组
        private int index = 0;

        /// <summary>
        /// 打开串口
        /// </summary>
        /// <param name="entiry"></param>
        public void OpenMyConn(SerialPortModel entiry)
        {
            if (myCom.IsOpen)
            {
                myCom.Close();//关闭
            }
            myCom.PortName = entiry.PortName;//串口名称
            myCom.BaudRate = entiry.BaudRate;//波特率
            myCom.DataBits = entiry.DataBits;//数据位
            myCom.StopBits = entiry.StopBits;//停止位
            myCom.Parity = entiry.Parity;//校验位 
            myCom.ReceivedBytesThreshold = 1;//设置串口缓冲区的字节数
            myCom.DataReceived += MyCom_DataReceived;//串口接收数据事件 
            myCom.Open();//打开串口
        }
        /// <summary>
        /// 串口接收事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MyCom_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //#region 写法1
            //index = 0;
            //while (MyCom.BytesToRead > 1)//循环读取缓冲区的数据
            //{
            //    myReceiveByte = (byte)MyCom.ReadByte();//从缓冲区读取一个字节数据
            //    bData[index] = myReceiveByte;//将读取到的一个字节数据存放在字节数组中 
            //    //string txt = Encoding.ASCII.GetString(bData, 0, index);//将字节转换成字符串
            //    myShowMsg(txt);
            //    index++;
            //    if (index >= 1024)
            //    {
            //        index = 0;
            //        MyCom.DiscardInBuffer();//丢弃缓冲区的数据
            //        return;
            //    }
            //}
            //if (index > 0)
            //{
            //    //数据解析 
            //    string txt = Encoding.ASCII.GetString(bData, 0, index);//将字节转换成字符串
            //    myShowMsg(txt);
            //}
            //#endregion

            #region 写法2 
            //读取串口缓冲区的字节数据
            byte[] result = new byte[MyCom.BytesToRead];
            MyCom.Read(result, 0, MyCom.BytesToRead);
            string str = Encoding.UTF8.GetString(result);
            myShowMsg(str);
            #endregion

        }

        /// <summary>
        /// 关闭串口
        /// </summary>
        public void CloseMycom()
        {
            if (MyCom.IsOpen)
            {
                MyCom.Close();//关闭
            }
        }
    }
}

SerialPortModel实体类代码:

using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SerialPortScanner
{
    /// <summary>
    /// 串口实体模型
    /// </summary>
    public class SerialPortModel
    {
        /// <summary>
        /// 端口号
        /// </summary>
        public String PortName { get; set; }
        /// <summary>
        /// 波特率
        /// </summary>
        public int BaudRate { get; set; }
        /// <summary>
        /// 数据位
        /// </summary>
        public int DataBits { get; set; }
        /// <summary>
        /// 停止位
        /// </summary>
        public StopBits StopBits { get; set; }
        /// <summary>
        /// 校验位
        /// </summary>
        public Parity Parity { get; set; }
    }
}

6、运行程序,首先建立连接

 

 扫一扫香烟,兵狼,矿泉水,瓜子,鸡腿等,所有的有条形码的商品都可以扫到,效果不错。

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图片优化: CssSprites与Base64编码

文章目录 1 css sprites1.1 CSS Sprites是什么1.2 为什么需要css sprites1.3 优势1.4 使用原理 2 图片Base64编码 1 css sprites 1.1 CSS Sprites是什么 CSS Sprites是一种网页图片应用处理方式。 又被解释为&#xff1a; CSS精灵CSS图像拼合CSS贴图定位CSS图片精灵CSS雪碧图…

快六一啦,学习CSS3实现一个冰淇淋动画特效

快六一啦&#xff0c;小时候顶多吃个小冰棍&#xff0c;或者是那种小冰袋&#xff0c;现在的小朋友真是好&#xff0c;动不动就能吃到冰淇淋&#xff0c;今天用CSS3实现一个冰淇淋的动画特效吧 目录 实现思路 桶身的实现 冰淇淋身体的实现 五彩颗粒的实现 HTML源码 CSS3源…

17 张程序员专属壁纸推荐

1、三思后再写代码&#xff01;&#xff01;&#xff01; 2、从世界上搜索喜欢你的人&#xff01;&#xff01;&#xff01; 3、代码没写完&#xff0c;哪里有脸睡觉&#xff01;&#xff01;&#xff01; 4、程序员的 Home 键&#xff01;&#xff01;&#xff01; 5、编程是…

【完整项目开发】Springboot+vue教学材料管理系统定制开发

Springbootvue 的专业建建设材料管理系统。 **大家好&#xff0c;今天分享最近做的一套系统。**起因源于小伙伴的需求 文末有的获取方式&#xff0c;如需定制系统&#xff0c;需求发来&#xff0c;我为你分忧&#xff0c;搞起 一、 项目介绍 基于各个专业&#xff0c;对教…

代码随想录算法训练营day56 | 583. 两个字符串的删除操作,72. 编辑距离,编辑距离总结篇

代码随想录算法训练营day56 | 583. 两个字符串的删除操作&#xff0c;72. 编辑距离&#xff0c;编辑距离总结篇 583. 两个字符串的删除操作解法一&#xff1a;动态规划解法二&#xff1a;计算最长公共子序列&#xff0c;然后用数组长度减掉子序列长度 72. 编辑距离解法一&#…

界面组件DevExpress ASP.NET Core v22.2 - UI组件升级

DevExpress ASP.NET Core Controls使用强大的混合方法&#xff0c;结合现代企业Web开发工具所期望的所有功能。该套件通过ASP.NET Razor标记和服务器端ASP.NET Core Web API的生产力和简便性&#xff0c;提供客户端JavaScript的性能和灵活性。ThemeBuilder工具和集成的Material…

【操作系统】01.操作系统概论

操作系统的发展历史 未配置操作系统 手工操作阶段 用户独占全机&#xff0c;人机速度矛盾导致系统资源利用率低 脱机输入输出方式 为了缓解主机cpu和IO设备之间速度不匹配的矛盾&#xff0c;出现了脱机IO技术 在外围机的控制下&#xff0c;通过输入设备&#xff0c;将数据输…

Spring事务和事务的传播机制

一、为什么需要事务 1.1事务定义 将一组操作封装成一个执行单元&#xff0c;要么全部成功要么全部失败。 1.2为什么要用事物 例如转账分为两个操作&#xff1a; 第⼀步操作&#xff1a;A 账户 -100 元。第⼆步操作&#xff1a;B 账户 100 元。 如果没有事务&#xff0c;第…

脱岗监测预警系统 yolov5

脱岗监测预警系统可以通过pythonyolov5网络模型深度学习算法&#xff0c;脱岗监测预警算法对现场人员岗位进行实时监测&#xff0c;自动识别是否存在脱岗行为&#xff0c;并及时发出警报。Yolo意思是You Only Look Once&#xff0c;它并没有真正的去掉候选区域&#xff0c;而是…

2023安卓逆向 -- 抓包环境设置(Charles+Postern)

一、下载Charles并设置代理 1、下载地址&#xff0c;一路下一步即可安装 https://www.charlesproxy.com/ 2、代理设置&#xff0c;抓取所有ip及所有端口的数据包&#xff0c;点击Proxy&#xff0c;选择SSL Proxying Settings 3、点击Add&#xff0c;Host和Port都填写*&#x…

chatgpt赋能python:Python中的升序降序sort解析

Python中的升序降序sort解析 在 Python 开发中&#xff0c;sort 方法是非常常用的方法&#xff0c;它可以对包含数字或字符串的列表进行排序&#xff0c;其中有两种排序方式&#xff0c;分别是升序和降序。本篇文章将会深入探讨 Python 中的 sort 方法&#xff0c;着重介绍升序…

【回顾经典AI神作】卷积神经网络CNN架构系列:LeNet,AlexNet,VGG,GoogLeNet,ResNet

卷积神经网络(CNN或ConvNet)是一种特殊的多层神经网络,旨在以最少的预处理直接从像素图像中识别视觉模式。ImageNet项目是一个大型视觉数据库,设计用于视觉对象识别软件研究。ImageNet 项目举办年度软件竞赛,即 ImageNet 大规模视觉识别挑战赛 (ILSVRC),软件程序竞相正…

企业客户管理难题都有哪些?CRM系统如何解决?

CRM系统在客户管理中的重要性不言而喻&#xff0c;它可以帮助企业提高销售效率&#xff0c;优化客户体验和忠诚度&#xff0c;增加市场份额和利润。那么&#xff0c;CRM客户管理系统如何解决大客户管理难题? 企业大客户管理难题都有哪些&#xff1a; 1、需求十分多变 大客户…

第二节 Python分支结构

文章目录 一&#xff0c;分支结构1.1 概述1.2 语法格式1.2.1 单分支语法结构1.2.2 多分支语法结构1.2.3 多重语法结构1.2.4 分支语句的嵌套结构 1.3 Debug调试1.4 三元运算符1.4.1 求两个数的差值 二 专项练习题2.1 计算快递包裹重量2.2 判断奇偶数2.3 判断闰年2.4 最大的数2.5…

Win11怎么远程控制另外一台电脑?

​Win11是微软推出的一款Windows操作系统&#xff0c;它改善了视觉效果&#xff0c;并具有许多创新功能&#xff0c;例如集成的Android应用程序&#xff0c;用于游戏的Xbox技术等。如今&#xff0c;许多用户已从Win10或Win7升级到Win11。但是很多用户不知道Win11怎么远程控制另…

ArcGis系列-java发布空间表为要素服务(feature)

1,实现思路 使用java调用cmd命令执行python脚本python环境使用arcgis pro安装目录下的 \ArcGIS\Pro\bin\Python\envs\arcgispro-py3发布数据库表前需要先用创建数据库的sde文件&#xff08;创建sde文件不需要连接arcgis&#xff09;发布表时,先在本地的空项目模板中添加数据库…

界面组件Telerik UI for WPF可轻松实现直方图,让数据可视化更简单

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序&#xff0c;同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等&#xff0c;创建的应用程序可靠且结构良好&#xff0c;非常容易维护&#xff0c;其直观的API将无缝地集成Visual Studio…

word如何设置页码?教您快速掌握!

案例&#xff1a;论文排版时&#xff0c;需要对页码进行编号&#xff0c;但我不知道怎么操作。我想如何快速设置word页码&#xff0c;有没有小伙伴可以分享一下方法&#xff1f; word是一款广泛使用的文字处理软件&#xff0c;许多人在撰写论文、报告或其他文档时都需要对页面…

StableDiffusion教程(3) - 模型安装

StableDiffusion模型安装 1. 搜索模型 打开C站或者LibLibAI模型站下载模型 C站地址&#xff1a;https://civitai.com/ LibLibAI模型站地址&#xff1a;LiblibAi - 中国领先原创AI模型分享社区 2. 下载模型 在模型详情页面&#xff0c;点击下载即可下载模型 3. 把模型放进S…

《A New General Type-2 Fuzzy Predictive Scheme for PID Tuning》翻译,2021年

《一种新的用于PID整定的通用2型模糊预测方案》 摘要 PID控制器在各种工业应用中被广泛使用。但是&#xff0c;在许多有噪音的问题中&#xff0c;需要强有力的方法来优化PID参数。在本文中&#xff0c;介绍了一种通过模型预测控制和广义 2 型模糊逻辑系统调整比例-积分-微分参数…