C# 串口读取基恩士手持扫码枪数据

工控行业中大部分扫码都是自动扫码,有2种方式来读取扫码信息,A)PLC触发扫码,读到码后写入PLC地址内,上位机读取扫到的条码; B) 上位机触发,然后读取。

这是整盘自动扫码的情况,但不保证每次都能将全盘扫码都能全部扫码成功;如有扫码ERROR的,都需要配置一个工位进行人工扫码;人工扫码可以提供一个输入框,直接连上扫码枪就可以扫码了。还有一种就是不用输入框,用串口来接受扫码结果;今天分享的就是用串口读取手持扫码枪的方式;

一. 定义一个System.IO.Ports 下的SerilPort实例;

 private SerialPort _serialPort = new SerialPort();

二. 初始化串口:

try
{
  //手持扫码枪;
  string portName = "COM4"; 
  int baudRate = 115200;
  _serialPort.PortName = portName;
  _serialPort.BaudRate = baudRate;
  _serialPort.Parity = Parity.Even; //奇偶校验-
  _serialPort.DataBits = 8;
  _serialPort.StopBits = StopBits.One;
  _serialPort.DiscardNull = true;               
  _serialPort.ReceivedBytesThreshold = 24; //条码长度24
  _serialPort.DataReceived += _serialPort_DataReceived;   
  _serialPort.RtsEnable = true;
  _serialPort.ReadTimeout = 500;
  _serialPort.WriteTimeout = 500;
  _serialPort.Open();
  AddLog(#34;连接手持扫码枪成功, 端口:{portName},波特率:{baudRate}");
}catch(Exception ex)
{
  AddLog(#34;连接手持扫码枪失败:"+ex.Message);
}

三. 定义数据接收方法

/// 
/// 接收扫码枪的扫码数据
/// 
/// 
/// 
private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  try
  {
    byte[] result = new byte[_serialPort.BytesToRead];
    if(result.Length>0)
    {
      _serialPort.Read(result, 0, _serialPort.BytesToRead);
      string barCode = Encoding.UTF8.GetString(result);
    } else
    {
      AddLog(#34;扫码失败!请重试");
    }

  }catch(Exception ex)
  {
    AddLog(#34;手持扫码异常:"+ex.Message);
    //判断端口是否打开,没有打开,尝试重新连接;
    if(_serialPort.IsOpen()==false) {
      //OpenPort();
    }
  }
}

代码很简单,但是一些串口的属性是需要了解熟悉的;如波特率,端口这些就不老生常谈了;

Parity 奇偶校验位

Even

2

设置奇偶校验位,使位数等于偶数。

Mark

3

将奇偶校验位保留为 1。

None

0

不发生奇偶校验检查。

Odd

1

设置奇偶校验位,使位数等于奇数。

Space

4

将奇偶校验位保留为 0。

上面的例子里面设置的就是偶校验位,因为我们收到的条码是24的;偶校验;

StopBits 停止位;

指定在 SerialPort 对象上使用的停止位的数目。每个字节的标准停止位;

None

0

不使用停止位。 StopBits 属性不支持此值。

One

1

使用一个停止位。

OnePointFive

3

使用 1.5 个停止位。

Two

2

使用两个停止位。

DataBits 每个字节的标准数据位长度

PLC 的一个字节就是8位,所以设置为8;

ReceivedBytesThreshold 每次接收的数据的字节数;

因为我们接收的条码长度为24位的,所以就设置缓存区就是24字节;根据自己项目的大小自己调整;否则会在 DataReceived的方法里面接收到的数据不是完整的;这样可以少写很多拼接的代码;

ReadTimeout WriteTimeout 读写超时时间,单位为S

RtsEnable DtrEnable

RtsEnable : 串行通信中是否启用请求发送 (RTS) 信号

DtrEnable 串行通信过程中启用数据终端就绪 (DTR) 信号


2,端口:Rts 4:Dtr端口,其他端口执行搜索;

SerialPort.IsOpen 判断串口是否打开;


写代码也跟其他事情差不多,也大多是一些套路,就看你玩的6不6。玩得溜就有更多时间摸鱼!多总结也是一个长期的投资。

展开阅读全文

页面更新:2024-03-14

标签:串口   波特率   数据   奇偶   上位   条码   位数   字节   端口   代码

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top