C#读取RS232串口扫描枪

news/2024/11/16 22:27:18/

扫描对于工业商业的主要输入设备很常见,与扫描枪的通讯也非常简单。之前看到网上有很多人问,但大多说人没有给出确切的回答,其实也就是源代码啦。

我刚好做了一个项目用到了这种扫描枪,现在把做的步骤和代码上传上来,跟大家分享一下。

RS232串口的扫描枪不会像USB的扫描枪自动的吧数据输入的光标焦点所在的位置,因此,需要我们手动的将扫描的数据添加到对应的位置。这也给我们 的软件开发增加了一丢丢工作。

如果是USB,则只需把鼠标光标定位到需要输入的位置上去。

如果是RS232的则需要一些额外的操作。

下面来看看实现的步骤。

环境:VS2015 C#,SerialPort类

首先熟悉,serialPort类,这个类是C#自带的一个串口通讯,使用非常方便,性能还算稳定,因为我用着目前没发现什么问题。不知道实时性如何。

表1                                                      SerialPort类的常用属性

名  称

说  明

BaseStream

获取 SerialPort 对象的基础 Stream 对象

BaudRate

获取或设置串行波特率

BreakState

获取或设置中断信号状态

BytesToRead

获取接收缓冲区中数据的字节数

BytesToWrite

获取发送缓冲区中数据的字节数

CDHolding

获取端口的载波检测行的状态

CtsHolding

获取“可以发送”行的状态

DataBits

获取或设置每个字节的标准数据位长度

DiscardNull

获取或设置一个值,该值指示 Null 字节在端口和接收缓冲区之间传输时是否被忽略

DsrHolding

获取数据设置就绪 (DSR) 信号的状态

DtrEnable

获取或设置一个值,该值在串行通信过程中启用数据终端就绪 (DTR) 信号

Encoding

获取或设置传输前后文本转换的字节编码

Handshake

获取或设置串行端口数据传输的握手协议

IsOpen

获取一个值,该值指示 SerialPort 对象的打开或关闭状态

NewLine

获取或设置用于解释 ReadLine( )和WriteLine( )方法调用结束的值

Parity

获取或设置奇偶校验检查协议

续表

名  称

说  明

ParityReplace

获取或设置一个字节,该字节在发生奇偶校验错误时替换数据流中的无效字节

PortName

获取或设置通信端口,包括但不限于所有可用的 COM 端口

ReadBufferSize

获取或设置 SerialPort 输入缓冲区的大小

ReadTimeout

获取或设置读取操作未完成时发生超时之前的毫秒数

ReceivedBytesThreshold

获取或设置 DataReceived 事件发生前内部输入缓冲区中的字节数

RtsEnable

获取或设置一个值,该值指示在串行通信中是否启用请求发送 (RTS) 信号

StopBits

获取或设置每个字节的标准停止位数

WriteBufferSize

获取或设置串行端口输出缓冲区的大小

WriteTimeout

获取或设置写入操作未完成时发生超时之前的毫秒数

表2                                                     SerialPort类的常用方法

方 法 名 称

说  明

Close

关闭端口连接,将 IsOpen 属性设置为False,并释放内部 Stream 对象

Open

打开一个新的串行端口连接

Read

从 SerialPort 输入缓冲区中读取

ReadByte

从 SerialPort 输入缓冲区中同步读取一个字节

ReadChar

从 SerialPort 输入缓冲区中同步读取一个字符

ReadLine

一直读取到输入缓冲区中的 NewLine 值

ReadTo

一直读取到输入缓冲区中指定 value 的字符串

Write

已重载。将数据写入串行端口输出缓冲区

WriteLine

将指定的字符串和 NewLine 值写入输出缓冲区

SerialPort使用方法:
1,首先添加引用
using System.IO.Ports;
using System.IO;
2,创建串口,实例化对象
public SerialPort myComPort = new SerialPort("COM4", 9600, Parity.None);
3,创建窗口接收函数
private void ReceiveData(object sender, SerialDataReceivedEventArgs e)
        {
            int n = myComPort.BytesToRead; 
            byte[] buf = new byte[n];
            myComPort.Read(buf, 0, n);
            textBox2.Invoke
                (
                new EventHandler(
                    delegate
                    {
                        textBox2.Text = textBox2.Text + Encoding.ASCII.GetString(buf);
                    }
                    )
                );


        }
4,串口接收函数绑定
myComPort.DataReceived += ReceiveData;

这里面需要注意的是
textBox2.Invoke
                (new EventHandler(

                    delegate
                    {
                        textBox2.Text = textBox2.Text + Encoding.ASCII.GetString(buf);
                    }
                    )
                );
这部分指令徐需要的,因为有可能你的串口被用在了其他线程里,所以需要用到代理,否则系统报错。


接下来就是写接收到扫描码的数据处理,

这个需要在根据你把数据写入到什么地方,这里是写入到了一个TEXTBOX里。

所以需要用textbox的数据更新事件来处理,

举例如:如果输入的条码,二维码以ENTER结束,则在收到ENTER后处理接收的数据

 private void textBox2_TextChanged(object sender, EventArgs e)
        {
            MessageBox.Show("KEY DOWN!");
            if (textBox2.Text[textBox2.TextLength - 2] == 0x0D && textBox2.Text[textBox2.TextLength - 1] == 0x0A)
            {
                MessageBox.Show("input the ENTER!");
            }
        }

串口接收也可以写成一个线程,不需要使用它的串口接收函数。如如下:

private void ReadPort()
        {
            while( _keepReading && myComPort.IsOpen )
            {
                int n = myComPort.BytesToRead;
                byte[] buf = new byte[n];
                myComPort.Read(buf, 0, n);
                textBox2.Invoke
                    (
                    new EventHandler(
                        delegate
                        {
                            textBox2.Text = textBox2.Text + Encoding.ASCII.GetString(buf);
                        }
                        )
                    );
            }
            
        }

另外增加:

_keepReading = true;
_readThread = new Thread(ReceiveData);
_readThread.Start();


结束

源代码传送门:

http://download.csdn.net/detail/u011518659/9748676


http://www.ppmy.cn/news/560922.html

相关文章

CH340串口驱动(包含各系统平台)

CH340转串口芯片支持的平台驱动齐全,支持 Windows/Linux/Android/MacOS/WinCE 等操作系统。各平台下驱动官网链接和说明如下,各平台的安装与使用问题可参见其他博文。 Windows驱动 下载链接:CH340/CH341 Windows 驱动链接http://www.wch.cn/…

Linux——进程控制:创建、终止、等待、替换

进程创建 fork #include <unistd.h> pid_t fork(void);操作系统做了什么&#xff1f; 调用fork之后&#xff0c;内核的工作&#xff1a; 分配新的内存块和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表当中fork返回&#xff0c…

服务器系统怎么打驱动精灵,win7系统如何使用驱动精灵?教你在win7系统使用驱动精灵的方法...

驱动精灵是一款驱动管理软件&#xff0c;功能性非常强&#xff0c;可以帮助用户安装驱动、备份驱动、卸载驱动等等。好多小伙伴在win7系统上安装驱动精灵却不知道如何使用&#xff1f;网上也有很多相关教程&#xff0c;但不够详细&#xff0c;因此&#xff0c;这里系统城小编来…

微波炉控制器的设计(EDA课程设计)

微波炉控制器的设计&#xff08;Quartus 9.1&#xff09; 1.设计一个具有定时和信息显示功能的微波炉控制器。 2.要求改微波炉控制器能够在任意时刻取消当前工作&#xff0c;复位为初始状态。 3.可以根据需要设置烹调时间的长短&#xff0c;系统最长的烹调时间为59分59秒&…

蠕动泵的常见参数及常用电机驱动芯片---Trinamic(TMC)

蠕动泵是一种可控制流速的液体输送装置&#xff0c;因为可以稳定控制流体的流速&#xff1b;无污染输送流体&#xff1b;维护简单便宜&#xff0c; 且具有输送精度高、较强的耐腐蚀性、剪切作用小、操作简单及易于维护等优势&#xff0c; 所以广泛应用在科研、制药、化工、环…

服务器系统安装蓝牙驱动,win10蓝牙驱动怎么安装?-win10蓝牙驱动的安装教程 - 河东软件园...

蓝牙是现在设备连接中使用的比较广泛的硬件之一&#xff0c;除了需要硬件支持以外&#xff0c;我们的电脑上也需要安装蓝牙驱动&#xff01;在我们将电脑升级到Win10之后&#xff0c;系统中是自带了蓝牙驱动的&#xff0c;不过据很多使用正式版系统的用户反映&#xff0c;电脑中…

TMC6300-LA-T-单轴BLDC驱动芯片-超低待机功耗

TMC6300 产品概述: 高效低电压、零待机电流驱动器&#xff0c;适用于峰值高达 2A 的 3 相 BLDC/PMSM 电机&#xff0c;三重半桥&#xff0c;带独立的 HS 和 LS 控制信号。 *自带保护和诊断功能以保证稳健和可靠的运行。 *集成电荷泵提供超低的RDSon和超低待机电流&#xff0…

53款热门驱动电机详细参数,拿走不谢

提供《新能源驱动电机对标样件》电驱动系统、电驱动总成样件清单、驱动电机目录、新能源电机、三合一电驱动、永磁同步电机、异步电驱动、油冷扁线电机、电机控制器、逆变器、差速器、电驱动桥、电机控制器的作用 切磋&#xff1a;shbinzer 切磋&#xff1a;shbinzer 切磋&…