SerialPort serialPort = new SerialPort();
/// <summary>
/// 初始化串口
/// </summary>
private void InitSerialPort()
{
log4netHelper.Info($"初始化串口开始");
try
{
#region MyRegion
if (serialPort.IsOpen)
serialPort.Close();
//端口名 注:设备管理器中查看一下虚拟com口的名字
string PortName = ConfigurationManager.AppSettings["PortName"].ToString();
string BaudRate = ConfigurationManager.AppSettings["BaudRate"].ToString();
string DataBits = ConfigurationManager.AppSettings["DataBits"].ToString();
serialPort.PortName = !string.IsNullOrEmpty(PortName) ? PortName : "COM5";//串口
serialPort.BaudRate = !string.IsNullOrEmpty(BaudRate) ? Convert.ToInt32(BaudRate) : 9600;//波特率,默认是9600
serialPort.DataBits = !string.IsNullOrEmpty(DataBits) ? Convert.ToInt32(DataBits) : 1;//数据位
serialPort.Parity = Parity.None;//校验位
serialPort.StopBits = StopBits.One;//停止位
serialPort.DiscardNull = true;
serialPort.ReadTimeout = 1000;//设置读取超时时间为1秒
serialPort.WriteTimeout = 1000; //设置写入超时时间为1秒
if (!serialPort.IsOpen)
{
serialPort.Close();
}
serialPort.Open();
log4netHelper.Info($"初始化串口成功");
serialPort.DataReceived += serialPort_DataReceived;//监听方法,具体看下面
#endregion
}
catch (Exception ex)
{
//MessageBox.Show(ex.Message);
log4netHelper.Info($"ERROR发生错误,扫描数据失败:{ex.Message}");
}
}
/// <summary>
/// 串口数据接收事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
log4netHelper.Info($"serialPort_DataReceived");
SerialPort serialPort = (SerialPort)sender;
log4netHelper.Info($"串口接收长度:{serialPort.BytesToRead}");
if (serialPort.BytesToRead == 0)
{
return;
}
else
{
#region
//Thread threadReceiveSub = new Thread(new ParameterizedThreadStart(ReceiveData));
//threadReceiveSub.Start(serialPort);
#endregion
#region
System.Threading.Thread.Sleep(200);//防止数据接收不完整 线程sleep(200)
//SerialPort serialPort = (SerialPort)serialPortobj;
//开辟接收缓冲区
byte[] receiveData = new byte[serialPort.BytesToRead];
//从串口读取数据
serialPort.Read(receiveData, 0, receiveData.Length);//同步读取数据
log4netHelper.Info($"串口接收数据为:" + receiveData + ",System.Text.Encoding.UTF8.GetString编码后" + System.Text.Encoding.UTF8.GetString(receiveData) + ",长度为:" + receiveData.Length);
string curBarCode = System.Text.Encoding.UTF8.GetString(receiveData, 0, receiveData.Length);
serialPort.ReadExisting();
if (string.IsNullOrEmpty(curBarCode))
{
this.UIThreadInvoke(new Action(() => { this.txtBarCode.Text = ""; }));
log4netHelper.Info($"串口接收数据转换结果为空!");
return;
}
else
{
//定义一个委托(delegate),委托(delegate)可以将参数与方法传递给控件所在的线程,并由控件所在的线程执行,通过Invoke来调用,这样可以完美的解决“线程间操作无效,从不是创建控件的线程访问它”
Action action = () =>
{
log4netHelper.Info($"串口接收数据转换结果为:" + curBarCode);
this.txtBarCode.Text = curBarCode;
int rowCount = IsBarcodeExist(curBarCode);//校验产品条码是否存在
if (rowCount > 0)
{
string msg = string.Format("产品条码信息【{0}】已存在,请重新扫码!", this.txtBarCode.Text.Trim());
log4netHelper.Info(msg);
this.lblResult.Text = msg;
this.lampStart.Status = Status.Close;
devActors[DevFullName].WriteChannelValue("Screwed_Start", 201);//向PCL中写入当前产品型号
log4netHelper.Info($"Screwed_Start写入PLC失败");
return;
}
WriteBarcodeToPLC(curBarCode, true);//将条码写到PCL
this.lampStart.Status = Status.OK;//开始信号灯
devActors[DevFullName].WriteChannelValue("Screwed_Start", 200);//向PCL中写入扫
log4netHelper.Info($"Screwed_Start写入PLC成功");
InitController();//初始化控件
};
Invoke(action);
log4netHelper.Info($"扫描截取信息:{curBarCode}");
}
serialPort.DiscardInBuffer();//丢弃来自串行驱动程序的接收缓冲区的数据
#endregion
}
}
catch (Exception ex)
{
//MessageBox.Show(ex.Message);
log4netHelper.Info("ERROR发生错误,扫描数据失败:" + ex.Message + "," + ex.StackTrace.ToString());
}
}