红外串口及扫描枪串口通信

快乐鱼儿 1年前 ⋅ 1018 阅读

最近因项目需求,对扫描枪和红外串口之间的通信深入的研究了一下,下面我简单说一下研发心得,供一些从来没接触过这方面开发的人员参考:

代码以C# winform为例. 供需要的人员使用。

 

1)红外串口通信:

首先电脑需要配置红外头及线,电脑会自动识别出对应的串口号,然后将对应的串口号和软件配置结合在一起。

/// <summary>
/// 初始化参数及串口
/// </summary>
private void initRedPortParm()
{
   serialPort = new SerialPort();
   serialPort.BaudRate = meterConfig.baudRate;
   serialPort.PortName = meterConfig.comName;
   serialPort.ReceivedBytesThreshold = 1;
   serialPort.DataReceived += new 
   SerialDataReceivedEventHandler(Com_DataReceived);
   if (serialPort.IsOpen == false)
      serialPort.Open();
}
/// <summary>
/// 红外串口接收数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
byte[] bufByte = receiveFromSerialPort(serialPort, 500);
if (bufByte != null && bufByte.Length > 0)
{
buf = bufByte;
LogWriter.WriteLog("接收串口数据:"+buf);
}
}
catch (Exception ex)
{
lblStatus.Text = "红外串口接收数据异常";
LogWriter.WriteLog(ex.Message);
}
}
/// <summary>
/// 接收串口数据
/// </summary>
/// <param name="serialPort">串口</param>
/// <param name="iSleepTime">暂停时长(毫秒)</param>
/// <returns></returns>

private byte[] receiveFromSerialPort(SerialPort serialPort, int iSleepTime)
{
byte[] buffer;
int iCount;
iCount = 0;
try
{
Thread.Sleep(iSleepTime);
iCount = serialPort.BytesToRead;
buffer = new byte[iCount];
serialPort.Read(buffer, 0, iCount);
//丢弃来自串行驱动程序的接受缓冲区的数据
serialPort.DiscardInBuffer();
return buffer;
}
catch (Exception exp)
{
lblStatus.Text = "红外接收数据异常";
LogWriter.WriteLog(exp.Message);
throw;
}
}
/// <summary>
/// 通过红外串口发送数据
/// </summary>
/// <param name="data">数据</param>
/// <returns></returns>
private bool SendData(byte[] data)
{

if (serialPort.IsOpen)
{
try
{
serialPort.Write(data, 0, data.Length);//发送数据
LogWriter.WriteLog("串口发送数据:"+data);
return true;
}
catch (Exception ex1)
{
LogWriter.WriteLog(ex1.Message);
lblStatus.Text = "红外连接已断开";
}
}
else
{
lblStatus.Text = "串口未打开";
}
return false;
}

 

2)扫描枪串口通信:

扫描枪分为串口扫描枪和USB扫描枪。在开发中他们对应的实现代码是不同的,如:

  • USB扫描枪代码接收事件:
private void meterCodeBox_TextChanged(object sender, EventArgs e)
   {
       try
         {
                //文本框接收值
                string s = meterCodeBox.Text.Trim();
                //判断接收的长度,如果扫描枪设置了Enter自动换行时会有换行字符,长度会多2位。
                if ((s.Length == 17 || s.Length == 18 || s.Length == 29 || s.Length == 30) && s.Substring(s.Length - 2) == "\r\n")
                {
                    Logger.WriteLog(s + "字符串长度:" + s.Length);
                    int iIndex = add(meterCodeBox.Text.Trim());
                    if (iIndex != -1)
                    {
                        startCheck(iIndex);
                    }
                }
              //如果扫描枪没有设置Enter自动换行,则接收的值为正常。
                else if (s.Length == 15 || s.Length == 28)
                {
                    Logger.WriteLog(s + "字符串长度:" + s.Length);
                    int iIndex = add(meterCodeBox.Text.Trim());
                    if (iIndex != -1)
                    {
                        startCheck(iIndex);
                    }
                }
         }
         catch (Exception exp)
         {
                MessageBox.Show("错误!" + System.Environment.NewLine + "错误信息:" + exp.Message, "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Error);
         }
   }
  • 串口扫描枪处理方法:
 private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
 {
       try
       {
           SerialPort serp = (SerialPort)sender;
           try
           {
              Thread.Sleep(200);  //(毫秒)等待一定时间,确保数据的完整性 int len   

              int len = serp.BytesToRead;
              if (len != 0)
              {
                 meterCodeBox.Invoke(new EventHandler(delegate
                 {
                      int iIndex = add(serp.ReadExisting());
                      if (iIndex != -1)
                      {
                        startCheck(iIndex);
                      }
                    }));
                  }
                  //丢弃来自串行驱动程序的接受缓冲区的数据
                  serp.DiscardInBuffer();
            }
            catch (Exception exp)
            {
               MessageBox.Show("错误:" + exp.Message, "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

         }
         catch (Exception exp)
          {
            MessageBox.Show("错误!" + System.Environment.NewLine + "错误信息:" + exp.Message, "系统消息", MessageBoxButtons.OK, MessageBoxIcon.Error);
          }
   }

 

 

 


全部评论: 0

    我有话说: