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 读写超时时间,单位为SRtsEnable DtrEnable
RtsEnable : 串行通信中是否启用请求发送 (RTS) 信号
DtrEnable 串行通信过程中启用数据终端就绪 (DTR) 信号
2,端口:Rts 4:Dtr端口,其他端口执行搜索;SerialPort.IsOpen 判断串口是否打开;
写代码也跟其他事情差不多,也大多是一些套路,就看你玩的6不6。玩得溜就有更多时间摸鱼!多总结也是一个长期的投资。