public class RQCodeComDevice
{
public delegate void EventHandleQRCode(string text);
public event EventHandleQRCode DataReceivedQRCode;
public SerialPort serialPort;
Thread thread;
volatile bool _keepReading;
public RQCodeComDevice()
{
serialPort = new SerialPort();
thread = null;
_keepReading = false;
}
public bool IsOpen
{
get
{
return serialPort.IsOpen;
}
}
private void StartReading()
{
if (!_keepReading)
{
_keepReading = true;
thread = new Thread(new ThreadStart(ReadPort));
thread.Start();
}
}
private void StopReading()
{
if (_keepReading)
{
_keepReading = false;
thread.Join();
thread = null;
}
}
private void ReadPort()
{
while (_keepReading)
{
try
{
if (serialPort.IsOpen)
{
string gpsinfo = "";
READAGAIN:
int n = serialPort.BytesToRead;
byte[] buf = new byte[n];
while (serialPort.BytesToRead > 0)
{
if (serialPort.Read(buf, 0, n) != 0)
{
String readstr = Encoding.UTF8.GetString(buf);
//Encoding encoding = System.Text.Encoding.GetEncoding("GB2312");
//String readstr = encoding.GetString(buf);
gpsinfo += readstr;
}
}
Thread.Sleep(50);
if (serialPort.BytesToRead > 0) goto READAGAIN;//goto标记,数据未接收完继续等待接收完成
string strInfo = gpsinfo ;
if (!string.IsNullOrEmpty(strInfo))
{
DataReceivedQRCode(strInfo);
}
}
}
catch (Exception)
{
//throw new ArgumentException("【ComDevice.ReadPort】" + ex.Message);
}
}
}
/// <summary>
/// 打开串口
/// </summary>
/// <returns></returns>
public bool Open()
{
try
{
Close();
serialPort.Open();
if (serialPort.IsOpen)
{
StartReading();
return true;
}
else
{
return false;
}
}
catch (Exception)
{
//new AggregateException(ex);
}
return false;
}
/// <summary>
/// 关闭串口
/// </summary>
public void Close()
{
StopReading();
serialPort.Close();
}
/// <summary>
/// 写数据到卡
/// </summary>
/// <param name="send"></param>
/// <param name="offSet"></param>
/// <param name="count"></param>
public void WritePort(byte[] send, int offSet, int count)
{
if (IsOpen)
{
serialPort.Write(send, offSet, count);
}
}
}
这是读取数据的帮助类。类的开头声明了一个委托事件,这个委托就是当二维码扫描头读取到数据触发返回数据的。
然后当使用的时候
public RQCodeComDevice comm1 = new RQCodeComDevice();
//二维码驱动方法
comm1.DataReceivedQRCode += new RQCodeComDevice.EventHandleQRCode(getQRCodeValue);
/// <summary>
/// 读取二维码的数据
/// </summary>
/// <param name="text"></param>
public void getQRCodeValue(string text)
{
try
{
if (!string.IsNullOrEmpty(text))
{
text = text.Trim();
//这里就是读取到的内容,可以进行各种业务处理
}
}
catch (Exception)
{
}
}
第一步先声明一个对象,然后给委托事件一个方法。就完成了。