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

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

    

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

 using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace NewLand
{
public delegate void ShowMsgDelegate(string info); public class NewLandSerial
{ //定义串口类对象
private SerialPort MyCom;
//定义接收字节数组
byte[] bData = new byte[];
byte mReceiveByte;
int mReceiveByteCount = ;
public ShowMsgDelegate myShowInfo; public NewLandSerial()
{
MyCom = new SerialPort(); } #region 打开关闭串口方法
/// <summary>
/// 打开串口方法【9600 N 8 1】
/// </summary>
/// <param name="iBaudRate">波特率</param>
/// <param name="iPortNo">端口号</param>
/// <param name="iDataBits">数据位</param>
/// <param name="iParity">校验位</param>
/// <param name="iStopBits">停止位</param>
/// <returns></returns>
public bool OpenMyComm(int iBaudRate, string iPortNo, int iDataBits, Parity iParity, StopBits iStopBits)
{
try
{
//关闭已打开串口
if (MyCom.IsOpen)
{
MyCom.Close();
}
//设置串口属性
MyCom.BaudRate = iBaudRate;
MyCom.PortName = iPortNo;
MyCom.DataBits = iDataBits;
MyCom.Parity = iParity;
MyCom.StopBits = iStopBits;
MyCom.ReceivedBytesThreshold = ;
MyCom.DataReceived += MyCom_DataReceived; MyCom.Open();
return true;
}
catch
{
return false;
}
} private void MyCom_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
mReceiveByteCount = ;
while (MyCom.BytesToRead > )
{
mReceiveByte = (byte)MyCom.ReadByte();
bData[mReceiveByteCount] = mReceiveByte;
mReceiveByteCount += ;
if (mReceiveByteCount >= )
{
mReceiveByteCount = ;
//清除输入缓存区
MyCom.DiscardInBuffer();
return;
}
}
if (mReceiveByteCount > )
{
myShowInfo(Encoding.ASCII.GetString(GetByteArray(bData, , mReceiveByteCount)));
} } /// <summary>
/// 自定义截取字节数组
/// </summary>
/// <param name="byteArr"></param>
/// <param name="start"></param>
/// <param name="length"></param>
/// <returns></returns>
private byte[] GetByteArray(byte[] byteArr, int start, int length)
{
byte[] Res = new byte[length];
if (byteArr != null && byteArr.Length >= length)
{
for (int i = ; i < length; i++)
{
Res[i] = byteArr[i + start];
} }
return Res;
} /// <summary>
/// 关闭串口方法
/// </summary>
/// <returns></returns>
public bool ClosePort()
{
if (MyCom.IsOpen)
{
MyCom.Close();
return true;
}
else
{
return false;
} }
#endregion }
}

NewLandSerial

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

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace NewLand
{
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
this.Load += FrmMain_Load; } private void FrmMain_Load(object sender, EventArgs e)
{
this.btn_DisConn.Enabled = false;
} private void txt_Info_DoubleClick(object sender, EventArgs e)
{
this.txt_Info.Clear();
} NewLandSerial myNewLand; private void btn_Connect_Click(object sender, EventArgs e)
{
string Port= ConfigurationManager.AppSettings["Port"].ToString(); myNewLand = new NewLandSerial();
myNewLand.myShowInfo += ShowInfo; if (myNewLand.OpenMyComm(, Port, , Parity.None, StopBits.One))
{
MessageBox.Show("连接成功!", "建立连接");
this.btn_Connect.Enabled = false;
this.btn_DisConn.Enabled = true;
}
else
{
MessageBox.Show("连接失败!", "建立连接");
}
} private void ShowInfo(string info)
{
Invoke(new Action(() =>
{
this.txt_Info.AppendText(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + " " + info + Environment.NewLine);
}));
} private void btn_DisConn_Click(object sender, EventArgs e)
{
if (myNewLand.ClosePort())
{
MessageBox.Show("断开连接成功!", "断开连接");
this.btn_Connect.Enabled = true;
this.btn_DisConn.Enabled = false;
}
else
{
MessageBox.Show("断开连接失败!", "断开连接");
}
} private void btn_ParaSet_Click(object sender, EventArgs e)
{
new FrmParaSet().ShowDialog();
}
}
}

FrmMain

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

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace NewLand
{
public partial class FrmParaSet : Form
{
public FrmParaSet()
{
InitializeComponent();
this.Load += FrmParaSet_Load;
} private void FrmParaSet_Load(object sender, EventArgs e)
{
for (int i = ; i < ; i++)
{
this.cmb_Port.Items.Add("COM" + i.ToString());
} this.cmb_Port.Text = ConfigurationManager.AppSettings["Port"].ToString();
} private void btn_Set_Click(object sender, EventArgs e)
{
Configuration cfa = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); //首先打开配置文件
cfa.AppSettings.Settings["Port"].Value = this.cmb_Port.Text;
cfa.Save(); //保存配置文件
ConfigurationManager.RefreshSection("appSettings"); //刷新配置文件
this.Close();
}
}
}

FrmParamSet

    如果大家还有什么不明白的地方,可以关注一下微信公众号:dotNet工控上位机

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

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

    阻塞IO与非阻塞IO 通常情况下的Socket都是阻塞式的, 程序的输入输出都会让当前线程进入阻塞状态, 因此服务器需要为每一个客户端都创建一个线程. 从JAVA1.4开始引入了NIO API, NI ...

  2. APP Inventor 基于网络微服务器的即时通信APP

    APP Inventor 基于网络微服务器的即时通信APP 一.总结 一句话总结:(超低配版的QQ,逃~) 1.APP Inventor是什么? google 傻瓜式 编程 手机 app App In ...

  3. 基于NIOS II的双端口CAN通信回环测试

    基于NIOS II的双端口CAN通信回环测试 小梅哥编写,未经授权,严禁用于任何商业用途 说明:本稿件为初稿,如果大家在使用的过程中有什么疑问或者补充,或者需要本文中所述工程源文件,欢迎以邮件形式发送 ...

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

    以前做过一个基于XMPP协议的聊天社交软件,总结了一下.发出来. 设计基于开源的XMPP即时通信协议,采用C/S体系结构,通过GPRS无线网络用TCP协议连接到服务器,以架设开源的Openfn'e服务 ...

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

    上篇博文链接 Prism for WPF初探(构建简单的模块化开发框架) 一.简单介绍: 在上一篇博文中初步搭建了Prism框架的各个模块,但那只是搭建了一个空壳,里面的内容基本是空的,在这一篇我将实 ...

  6. 基于ZYNQ的双核启动与通信问题解决

    1    处理器间的通信 为AMP 设计创建应用之前,您需要考虑应用如何进行通信(如有需要).最简单的方法是使用片上存储器.Zynq SoC 配备256KB 的片上SRAM,可从以下四个源地址进行访问 ...

  7. 基于Tcp协议的简单Socket通信实例(JAVA)

    好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. ...

  8. Java实例练习——基于UDP协议的多客户端通信

    昨天学习了UDP协议通信,然后就想着做一个基于UDP的多客户端通信(一对多),但是半天没做出来,今天早上在参考了很多代码以后,修改了自己的代码,然后运行成功,在这里分享以下代码,也说一下自己的认识误区 ...

  9. 基于TCP 协议的socket 简单通信

    DNS 服务器:域名解析 socket 套接字 : ​ socket 是处于应用层与传输层之间的抽象层,也是一组操作起来非常简单的接口(接受数据),此接口接受数据之后,交由操作系统 为什么存在 soc ...

随机推荐

  1. Netty实践场景

    数据通信 如果需要考虑的是两台机器(甚至多台)怎么使用Netty进行通信.大体上分为三种: 1 第一种:使用长连接通道不断开的形式进行通信.也就是服务端和客户端的通道一直处于开启状态. 如果服务器性能 ...

  2. ajax与HTML5 history API实现无刷新跳转

    一.ajax载入与浏览器历史的前进与后退 ajax可以实现页面的无刷新操作,但是无法前进与后退,淡出使用Ajax不利于SEO.如今,HTML5让事情变得简单.当执行ajax操作时,往浏览器histor ...

  3. 最全的tcpdump使用详解

    简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的 ...

  4. Thymeleaf th:include、th:replace引用

    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" ...

  5. IO调度 | Linux块设备中的IO路径及调度策略

    当文件系统通过submit_bio提交IO之后,请求就进入了通用块层.通用块层会对IO进行一些预处理的动作,其目的是为了保证请求能够更加合理的发送到底层的磁盘设备,尽量保证性能最佳.这里面比较重要的就 ...

  6. 风控分类模型种类(决策、排序)比较与模型评估体系(ROC/gini/KS/lift)

    python信用评分卡建模(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_ca ...

  7. 009-DNS域名解析系统

    一.概述 DNS是域名系统(DomainNameSystem)的缩写,该系统用于命名组织到域层次结构中的计算机和网络服务.域名是由圆点分开一串单词或缩写组成的,每一个域名都对应一个惟一的IP地址,在I ...

  8. delphi7 clientdataset 详解

    delphi Midas SQLServer的自增字段的处理1.新增时,表中有自增字段,但是不希望用Refresh,直接ApplyUpdates直接看见自增字段的值在DataSetProvider.A ...

  9. pycharm建立第一个django工程-----windows中

    pycharm建立第一个django工程 系统:win764 ip: 192.168.0.100 安装django pip install django 左上角建立一个名为Firstdjango工程 ...

  10. img标签替换为mip-img标签的方法

    function replaceMipImages($content){ preg_match_all('/<img (.*?)\>/', $content, $images); if(! ...