串口扫描枪的简单实现

基于串口通讯的扫描枪的实现,主要借助serialport类,表示串行端口资源。实现很简单:

工具:usb转rs232转接头/个,扫描枪/套,

扫描枪串口接入转接头,转接头插电脑

接下来具体代码实现

 

  1 using system;
  2 using system.collections.generic;
  3 using system.componentmodel;
  4 using system.data;
  5 using system.drawing;
  6 using system.linq;
  7 using system.text;
  8 using system.threading.tasks;
  9 using system.windows.forms;
 10 using system.net;
 11 using system.io.ports;
 12 using system.threading;
 13 
 14 namespace serialscannerdemo
 15 {
 16     public partial class serialscanner : form
 17     {
 18         public serialscanner()
 19         {
 20             initializecomponent();
 21         }
 22 
 23         private void form1_load(object sender, eventargs e)
 24         {
 25             instanceserialport();
 26         }
 27 
 28         /// <summary>
 29         /// 实例化串行端口资源
 30         /// </summary>
 31         private void instanceserialport()
 32         {
 33             //实例化串行端口
 34             serialport serialport = new serialport();
 35             //端口名  注:因为使用的是usb转rs232 所以去设备管理器中查看一下虚拟com口的名字
 36             serialport.portname = "com5";
 37             //波特率
 38             serialport.baudrate = 9600;
 39             //奇偶校验
 40             serialport.parity = parity.none;
 41             //停止位
 42             serialport.stopbits = stopbits.one;
 43             //数据位
 44             serialport.databits = 8;
 45             //忽略null字节
 46             serialport.discardnull = true;
 47             //接收事件
 48             serialport.datareceived += serialport_datareceived;
 49             //开启串口
 50             serialport.open();
 51         }
 52 
 53         /// <summary>
 54         /// 接收数据
 55         /// </summary>
 56         /// <param name="sender"></param>
 57         /// <param name="e"></param>
 58         void serialport_datareceived(object sender, serialdatareceivedeventargs e)
 59         {
 60             try
 61             {
 62                 serialport serialport = (serialport)sender;
 63                 //开启接收数据线程
 64                 thread threadreceivesub = new thread(new parameterizedthreadstart(receivedata));
 65                 threadreceivesub.start(serialport);
 66             }
 67             catch (exception ex)
 68             {
 69                 setmessage(ex.message);
 70             }
 71         }
 72 
 73         private void receivedata(object serialportobj)
 74         {
 75             try
 76             {
 77                 serialport serialport = (serialport)serialportobj;
 78 
 79                 //防止数据接收不完整 线程sleep(100)
 80                 system.threading.thread.sleep(100);
 81 
 82                 string str = serialport.readexisting();
 83 
 84                 if (str == string.empty)
 85                 {
 86                     return;
 87                 }
 88                 else
 89                 {
 90                     setmessage(str);
 91                 }
 92             }
 93             catch (exception ex)
 94             {
 95                 setmessage(ex.message);
 96             }
 97         }
 98         /// <summary>
 99         /// 添加记录
100         /// </summary>
101         /// <param name="msg"></param>
102         private void setmessage(string msg)
103         {
104             richtextbox1.invoke(new action(() => { richtextbox1.appendtext(msg + "\r\n"); }));
105         }
106     }
107 }

 

注:因为使用的是usb转rs232 所以去设备管理器中查看一下虚拟com口的名字

接下来测试

找一张带有条码的包装袋或者印有条码的纸扫描

测试完成

 

这里说明一下

serialport中有6个读的方法

read();readline(); readbyte();readchar();这几个读方法是同步读

readexisting();readto();这两个方法是异步读

代码中在读之前使用了thread.sleep()方法使线程沉睡,目的就是要使异步读,读出的数据完整

 

顺便说一下,基于以太网的扫描枪的实现,其实将扫描枪当做是一个客户端,扫描完成一次相当于发送了一次基于tcp或者udp的请求,使用的socket服务器略加改变就能实现

c#socket服务器与客户端的开发(1)

源码:

链接:https://pan.baidu.com/s/1mdcj_i8w0rti-pis1ybdha
提取码:xs8d