如今在做的是蓝牙扫码器和车载程序的通讯,作用是当扫码后会把条码值传递给车载程序,车载程序通过条码值去数据库里查询相对应的信息显示到页面中。原来的想法是通过车载程序直接连接蓝牙扫码器,这一步是实现了,详看《 C#连接蓝牙设备》这篇文章,最后一步想要我们可以实施获取到传过来的值,所以一直在查找关于接收蓝牙设备传值的方法,不过没有什么成效,所以换了一下思路使用了串口通讯。最终实现了效果,可以成功接收到值,这里分享一下方法,因为码中携带部分注释,所以下面不做说明。
1.获取本机串口列表
/// <summary>
/// 获取本机串口列表
/// </summary>
/// <param name="isUseReg"></param>
/// <returns></returns>
private List<string> GetComlist(bool isUseReg)
{
List<string> list = new List<string>();
try
{
if (isUseReg)
{
RegistryKey RootKey = Registry.LocalMachine;
RegistryKey Comkey = RootKey.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM");
String[] ComNames = Comkey.GetValueNames();
foreach (String ComNamekey in ComNames)
{
string TemS = Comkey.GetValue(ComNamekey).ToString();
list.Add(TemS);
}
}
else
{
foreach (string com in SerialPort.GetPortNames()) //自动获取串行口名称
list.Add(com);
}
}
catch
{
MessageBox.Show("提示信息", "串行端口检查异常!");
System.Environment.Exit(0); //彻底退出应用程序
}
return list;
}
2.开启串口监听
/// <summary>
/// 开启串口监听
/// </summary>
private void StartSerialPortMonitor()
{
List<string> comList = GetComlist(false); //首先获取本机关联的串行端口列表
if (comList.Count == 0)
{
MessageBox.Show("提示信息", "当前设备不存在串行端口!");
System.Environment.Exit(0); //彻底退出应用程序
}
else
{
string targetCOMPort = "COM4";
//判断串口列表中是否存在目标串行端口
if (!comList.Contains(targetCOMPort))
{
MessageBox.Show("提示信息", "当前设备不存在配置的串行端口!");
System.Environment.Exit(0); //彻底退出应用程序
}
serialPort = new SerialPort();
//设置参数
//通过串口工具查出来我们需要通讯的串口,全部给固定值
serialPort.PortName = "COM4"; //通信端口
serialPort.BaudRate = 9600; //串行波特率
serialPort.DataBits = 8; //每个字节的标准数据位长度
serialPort.StopBits = StopBits.One; //设置每个字节的标准停止位数
serialPort.Parity = Parity.None; //设置奇偶校验检查协议
serialPort.ReadTimeout = 3000; //单位毫秒
serialPort.WriteTimeout = 3000; //单位毫秒
//串口控件成员变量,字面意思为接收字节阀值,
//串口对象在收到这样长度的数据之后会触发事件处理函数
//一般都设为1
serialPort.ReceivedBytesThreshold = 1;
serialPort.DataReceived += new SerialDataReceivedEventHandler(CommDataReceived); //设置数据接收事件(监听)
try
{
serialPort.Open(); //打开串口
}
catch (Exception ex)
{
MessageBox.Show("提示信息", "串行端口打开失败!具体原因:" + ex.Message);
System.Environment.Exit(0); //彻底退出应用程序
}
}
}
我们这里设置了参数,如果不知道参数和自己想要连接的设备串口的话,可以下载个串口调试工具试一下,然后把参数设置成一样的就可以。
**查看串口的方法:**设备管理器=》端口(COM和LPT)
这里我就是使用了串口工具,挨个试然后找出了我蓝牙设备的串口。
找不到合适工具的可以去我的资源中下载。
3.串口数据处理
/// <summary>
/// 串口数据处理函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void CommDataReceived(Object sender, SerialDataReceivedEventArgs e)
{
try
{
//Comm.BytesToRead中为要读入的字节长度
int len = serialPort.BytesToRead;
Byte[] readBuffer = new Byte[len];
serialPort.Read(readBuffer, 0, len); //将数据读入缓存
//处理readBuffer中的数据,自定义处理过程
string msg = Encoding.UTF8.GetString(readBuffer, 0, len-1); //获取出入库产品编号
MessageBox.Show(msg);
}
catch (Exception ex)
{
MessageBox.Show("接收返回消息异常!具体原因:" + ex.Message, "提示信息");
}
}
这里面有两个需要注意的地方,下面看一下正确的写法和错误的写法:
string msg = Encoding.UTF8.GetString(readBuffer, 0, len-1); //获取出入库产品编号
string msg = Encoding.GetString(readBuffer, 0, len); //获取出入库产品编号
第一行就是正确的写法,首先如果不加UTF8的话,我这里是报错的,具体原因我也没研究明白,不过我加上.UTF8后就正常了,第二个需要注意的点就是len一定要-1,不然的话后面会跟个转义符。