基于C#实现与新大陆扫码枪通信

原文:基于C#实现与新大陆扫码枪通信

   随着工业互联的发展,扫码枪在很多场合都有所应用,超市、商场以及一些智能工厂。今天主要讲如何通过C#实现与新大陆扫码枪(OY10)进行通信,对于扫码枪的配置,这里就不多说了,结合说明书就可以实现。这里值得注意的是,如果安装驱动后,电脑设备管理器中看不到COM口,可能需要扫一个条形码来设置一下,具体参考说明书通讯配置章节。

   首先贴下界面,基于Winform开发,主要就是正常的串口通信,涉及的技术包括UI界面设计+串口通信知识+参数配置处理+委托更新界面,涵盖了一个小系统必备的一些知识。

    

    再来贴一些源码,首先贴个核心串口类的编写:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.IO.Ports;
  4 using System.Linq;
  5 using System.Text;
  6 using System.Threading.Tasks;
  7
  8 namespace NewLand
  9 {
 10     public delegate void ShowMsgDelegate(string info);
 11
 12     public class NewLandSerial
 13     {
 14
 15         //定义串口类对象
 16         private SerialPort MyCom;
 17         //定义接收字节数组
 18         byte[] bData = new byte[1024];
 19         byte mReceiveByte;
 20         int mReceiveByteCount = 0;
 21         public ShowMsgDelegate myShowInfo;
 22
 23         public NewLandSerial()
 24         {
 25             MyCom = new SerialPort();
 26
 27         }
 28
 29         #region 打开关闭串口方法
 30         /// <summary>
 31         /// 打开串口方法【9600 N 8 1】
 32         /// </summary>
 33         /// <param name="iBaudRate">波特率</param>
 34         /// <param name="iPortNo">端口号</param>
 35         /// <param name="iDataBits">数据位</param>
 36         /// <param name="iParity">校验位</param>
 37         /// <param name="iStopBits">停止位</param>
 38         /// <returns></returns>
 39         public bool OpenMyComm(int iBaudRate, string iPortNo, int iDataBits, Parity iParity, StopBits iStopBits)
 40         {
 41             try
 42             {
 43                 //关闭已打开串口
 44                 if (MyCom.IsOpen)
 45                 {
 46                     MyCom.Close();
 47                 }
 48                 //设置串口属性
 49                 MyCom.BaudRate = iBaudRate;
 50                 MyCom.PortName = iPortNo;
 51                 MyCom.DataBits = iDataBits;
 52                 MyCom.Parity = iParity;
 53                 MyCom.StopBits = iStopBits;
 54                 MyCom.ReceivedBytesThreshold = 1;
 55                 MyCom.DataReceived += MyCom_DataReceived;
 56
 57                 MyCom.Open();
 58                 return true;
 59             }
 60             catch
 61             {
 62                 return false;
 63             }
 64         }
 65
 66         private void MyCom_DataReceived(object sender, SerialDataReceivedEventArgs e)
 67         {
 68             mReceiveByteCount = 0;
 69             while (MyCom.BytesToRead > 0)
 70             {
 71                 mReceiveByte = (byte)MyCom.ReadByte();
 72                 bData[mReceiveByteCount] = mReceiveByte;
 73                 mReceiveByteCount += 1;
 74                 if (mReceiveByteCount >= 1024)
 75                 {
 76                     mReceiveByteCount = 0;
 77                     //清除输入缓存区
 78                     MyCom.DiscardInBuffer();
 79                     return;
 80                 }
 81             }
 82             if (mReceiveByteCount > 0)
 83             {
 84                 myShowInfo(Encoding.ASCII.GetString(GetByteArray(bData, 0, mReceiveByteCount)));
 85             }
 86
 87         }
 88
 89         /// <summary>
 90         /// 自定义截取字节数组
 91         /// </summary>
 92         /// <param name="byteArr"></param>
 93         /// <param name="start"></param>
 94         /// <param name="length"></param>
 95         /// <returns></returns>
 96         private byte[] GetByteArray(byte[] byteArr, int start, int length)
 97         {
 98             byte[] Res = new byte[length];
 99             if (byteArr != null && byteArr.Length >= length)
100             {
101                 for (int i = 0; i < length; i++)
102                 {
103                     Res[i] = byteArr[i + start];
104                 }
105
106             }
107             return Res;
108         }
109
110
111         /// <summary>
112         /// 关闭串口方法
113         /// </summary>
114         /// <returns></returns>
115         public bool ClosePort()
116         {
117             if (MyCom.IsOpen)
118             {
119                 MyCom.Close();
120                 return true;
121             }
122             else
123             {
124                 return false;
125             }
126
127         }
128         #endregion
129
130     }
131 }

NewLandSerial

    再者就是界面的调用,直接看代码:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Configuration;
 5 using System.Data;
 6 using System.Drawing;
 7 using System.IO.Ports;
 8 using System.Linq;
 9 using System.Text;
10 using System.Threading.Tasks;
11 using System.Windows.Forms;
12
13 namespace NewLand
14 {
15     public partial class FrmMain : Form
16     {
17         public FrmMain()
18         {
19             InitializeComponent();
20             this.Load += FrmMain_Load;
21
22         }
23
24         private void FrmMain_Load(object sender, EventArgs e)
25         {
26             this.btn_DisConn.Enabled = false;
27         }
28
29         private void txt_Info_DoubleClick(object sender, EventArgs e)
30         {
31             this.txt_Info.Clear();
32         }
33
34         NewLandSerial myNewLand;
35
36
37         private void btn_Connect_Click(object sender, EventArgs e)
38         {
39            string Port= ConfigurationManager.AppSettings["Port"].ToString();
40
41             myNewLand = new NewLandSerial();
42             myNewLand.myShowInfo += ShowInfo;
43
44             if (myNewLand.OpenMyComm(9600, Port, 8, Parity.None, StopBits.One))
45             {
46                 MessageBox.Show("连接成功!", "建立连接");
47                 this.btn_Connect.Enabled = false;
48                 this.btn_DisConn.Enabled = true;
49             }
50             else
51             {
52                 MessageBox.Show("连接失败!", "建立连接");
53             }
54         }
55
56         private void ShowInfo(string info)
57         {
58             Invoke(new Action(() =>
59             {
60                 this.txt_Info.AppendText(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "   " + info + Environment.NewLine);
61             }));
62         }
63
64         private void btn_DisConn_Click(object sender, EventArgs e)
65         {
66             if (myNewLand.ClosePort())
67             {
68                 MessageBox.Show("断开连接成功!", "断开连接");
69                 this.btn_Connect.Enabled = true;
70                 this.btn_DisConn.Enabled = false;
71             }
72             else
73             {
74                 MessageBox.Show("断开连接失败!", "断开连接");
75             }
76         }
77
78         private void btn_ParaSet_Click(object sender, EventArgs e)
79         {
80             new FrmParaSet().ShowDialog();
81         }
82     }
83 }

FrmMain

    最后是参数配置,通过App.Config实现:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Configuration;
 5 using System.Data;
 6 using System.Drawing;
 7 using System.Linq;
 8 using System.Text;
 9 using System.Threading.Tasks;
10 using System.Windows.Forms;
11
12 namespace NewLand
13 {
14     public partial class FrmParaSet : Form
15     {
16         public FrmParaSet()
17         {
18             InitializeComponent();
19             this.Load += FrmParaSet_Load;
20         }
21
22         private void FrmParaSet_Load(object sender, EventArgs e)
23         {
24             for (int i = 0; i < 20; i++)
25             {
26                 this.cmb_Port.Items.Add("COM" + i.ToString());
27             }
28
29             this.cmb_Port.Text = ConfigurationManager.AppSettings["Port"].ToString();
30         }
31
32         private void btn_Set_Click(object sender, EventArgs e)
33         {
34             Configuration cfa = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); //首先打开配置文件
35             cfa.AppSettings.Settings["Port"].Value = this.cmb_Port.Text;
36             cfa.Save();  //保存配置文件
37             ConfigurationManager.RefreshSection("appSettings");  //刷新配置文件
38             this.Close();
39         }
40     }
41 }

FrmParamSet

原文地址:https://www.cnblogs.com/lonelyxmas/p/11105738.html

时间: 2024-08-30 13:21:29

基于C#实现与新大陆扫码枪通信的相关文章

JAVA基础知识之网络编程——-基于NIO的非阻塞Socket通信

阻塞IO与非阻塞IO 通常情况下的Socket都是阻塞式的, 程序的输入输出都会让当前线程进入阻塞状态, 因此服务器需要为每一个客户端都创建一个线程. 从JAVA1.4开始引入了NIO API, NIO可以实现非阻塞IO, 这样就可以使用一个线程处理所有的客户请求. 基于NIO的非阻塞Socket通信 服务器将用来监听客户端请求的channel注册到selector上,启动一个线程,使用selector的select()获取求情的客户端的channel数量, 当监听到有客户端请求时,就通过Sel

基于mina的的android即时通信app

前段时间研究mina框架,发现很适合做即时通信后台,经过几个月的研发本人开发了一套基于mina框架的android即时通信app,暂命名为E聊.鉴于本人能力有限还存在不少bug,希望大家原谅并指出,bug和部分功能还在不断完善中,过段时间部分代码会进行开源,敬请关注. 主要功能包括: 1.私聊,群聊 2.支持文字.语音.图片.文件.小视频等 3.位置共享(开发中) 4.朋友圈(图文发布.评论等,小视频功能正在开发中) 5.上线通知,断线重连 6.接收离线消息 7.更多功能正在筹划中... 演示图

基于进程池的多进程服务器通信

代码来源:游双的linux高性能服务器编程 主进程创建一个进程池,当有客户端发送请求时,主进程选择一个进程与该客户端进行通信,为了简单期间,去掉了一些信号处理代码,其中信号的用法可以参考基于多进程的网络聊天程序 服务器代码如下: #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <assert.h&

基于XMPP协议的Android即时通信系

以前做过一个基于XMPP协议的聊天社交软件,总结了一下.发出来. 设计基于开源的XMPP即时通信协议,采用C/S体系结构,通过GPRS无线网络用TCP协议连接到服务器,以架设开源的Openfn'e服务器作为即时通讯平台. 系统主要由以下部分组成:一是服务器,负责管理发出的连接或者与其他实体的会话,接收或转发XML(ExtensibleMarkup Language)流元素给授权的客户端.服务器等:二是客户终端.它与服务器相连,通过XMPP获得由服务器或任何其它相关的服务所提供的全部功能.三是协议

分布式Java应用之基于消息方式实现系统间的通信(2)

基于Java自身技术实现消息方式的系统间通信 基于Java自身包实现消息方式的系统间通信的方式有:TCP/IP+BIO.TCP/IP+NIO.UDP/IP+BIO以及UDP/IP+NIO 4种,下面分别介绍如何实现这4种方式的系统间通信. TCP/IP+BIO 在Java中可基于Socket.ServerSocket来实现TCP/IP+BIO的系统间通信. Socket主要用于实现建立连接及网络IO的操作,ServerSocket主要用于实现服务器端端口的监听及Socket对象的获取. 1.基于

基于TCP协议的简单Socket通信笔记(JAVA)

好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. 1.首先先来看下基于TCP协议Socket服务端和客户端的通信模型: Socket通信步骤:(简单分为4步) 1.建立服务端ServerSocket和客户端Socket 2.打开连接到Socket的输出输入流 3.按照协议进行读写操作 4.关闭相对应的资源 2.相关联的API: 1.首先先来看下S

[转] 基于XMPP协议的Android即时通信系

转自:http://blog.csdn.net/lnb333666/article/details/7471292 以前做过一个基于XMPP协议的聊天社交软件,总结了一下.发出来. 设计基于开源的XMPP即时通信协议,采用C/S体系结构,通过GPRS无线网络用TCP协议连接到服务器,以架设开源的Openfn'e服务器作为即时通讯平台. 系统主要由以下部分组成:一是服务器,负责管理发出的连接或者与其他实体的会话,接收或转发XML(ExtensibleMarkup Language)流元素给授权的客

Prism for WPF再探(基于Prism事件的模块间通信)

上篇博文链接 一.简单介绍: 在上一篇博文中初步搭建了Prism框架的各个模块,但那只是搭建了一个空壳,里面的内容基本是空的,在这一篇我将实现各个模块间的通信,在上一篇博文的基础上改的. 先上效果图:初步介绍下,图中虚线分割为四个模块,每个模块可向另外三个模块发消息.这里还是基于模块化开发CS端程序的思路,模块之间低耦合,如果项目做大,好处自然体现出来了. 图中的效果已经实现了一个模块朝其他三个模块发送消息.这里我使用的事Prism框架中的PubSubEvent事件,其优点是简单易用,直接Pub

【经验分享】基于创龙AM5708多核间通信的IPC例程通用开发流程

c此文章原创来源于:创龙电子 ? ? ? ??AM5708嵌入式开发板是一款由创龙基于TI AM570x浮点DSP C66x + ARM Cortex-A15工业控制及可编程音视频处理器.由SOM-TL570x工业核心板设计的开发板,它为用户提供了SOM-TL570x工业核心板的测试平台,用于快速评估SOM-TL570x工业核心板的整体性能.广泛应用于机器视觉.电力自动化.智能交通.医疗器械.自动分拣装置.高精度仪器仪表.高端数控系统等多种工业应用场合. ? ? ? ? 下面简单讲解一下创龙基于