我们公司写web的系统,要嵌入到别人的桌面系统中,现在有业务要做扫码功能。
在某宝上找了一个支持二次开发,并且是usb的(有串口的直接对接,但是一般电脑都没有这个接口放弃,找了一个usb的厂家)
该厂家usb接口是需要一个操作安装一个驱动来虚拟一个串口,以上步骤就跳过了,上代码先。
/// <summary>
/// 连接串口
/// </summary>
/// <param name="name">串口名称</param>
public void SerialPortConn(string name)
{
SerialPort serialPort = new SerialPort(name);
serialPort.DataReceived += (object sender, SerialDataReceivedEventArgs e) =>
{
/**
* 这里面是扫码器传过来的
*/
SerialPort sp = (SerialPort)sender;
byte[] buffer = new byte[sp.BytesToRead];
sp.Read(buffer, 0, sp.BytesToRead);
// 这个判断是一般二维码比这个长,而这个长度更多的是扫码器系统的反馈
if (buffer.Length == 6 || buffer.Length == 7)
{
// 初步判定这里是扫码器的内容
// 扫码器的内容是16进制,所以要用不一样的方式解码去判断
string str = BitConverter.ToString(buffer);
if (str == "04-D0-00-00-FF-2C")
{
MessageBox.Show("设置成功");
return;
}
else if (str == "05-D1-00-00-01-FF-29")
{
MessageBox.Show("设置失败");
return;
}
// 上面没有命中的话,就单单做是二维码内容
string content = System.Text.Encoding.UTF8.GetString(buffer);
// content 是二维码内容,开始你自己的业务吧
}
};
serialPort.Open();
}
/// <summary>
/// 发送指令
/// </summary>
/// <param name="bytes"></param>
private void send(byte[] bytes)
{
serialPort.Write(bytes, 0, bytes.Length);
}
/// <summary>
/// 发送指令
/// </summary>
/// <param name="cmd"></param>
private void send(string cmd)
{
serialPort.Write(cmd);
}
我对接的厂家是16进制的指令,文档描述是这样子的
代码是这样子写的,自己模仿模仿吧,我也不知道怎么说给你听了(还是说一下吧,就是字节数组,只是数组的每一项前面加一个x0)
var bytes = new byte[] {
0x07,
0xC6,
0x04,
0x08,
0x00,
0x8C,
0x02,
0xFE,
0x99,
};
send(bytes);
这样就可以了。
====================================================================================
估计要被打死,上面的name怎么来,这个是自己捣鼓的,应该有更好的方案,当时我没有找到,暂时还没有用,先用着我的简单的方案先吧
大致思路是借助设备的串口,发送指令之后会有回应,得到正确的回应为我们要的设备,代码就不贴完整的了,看上面的代码自己整吧
// 获取所有串口的名称
string[] PortItems = SerialPort.GetPortNames();