using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Data;
using System.Net;
using System.IO;
using System.IO.Ports;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace SyUpLoad
{
partial class PartLoad
{
///
/// 从DataReceived扫描枪发送条码到处理程序
/// BarCode(string barCode)
///
///
public delegate void BarCodeInvoke(string barCode);
///
/// BarCode(string barCode)
/// 从DataReceived扫描枪发送条码到处理程序
///
BarCodeInvoke barCodeInvoke;
///
/// 当前扫描枪类型
/// 1:手持;2:固定
///
string ScannerType_Current = "1";
//手持扫描枪
private System.IO.Ports.SerialPort serialPort1 = new SerialPort();
///
/// 初始化COM通讯口
///
public void SetCOM()
{
try
{
//首选扫描枪
barCodeInvoke = new BarCodeInvoke(BarCode);
SetCOM1();
}
catch (Exception err)
{
// ApplicationLog.WriteLog(err, err.Message);
}
}
///
/// 初始化COM通讯口
///
public void SetCOM1()
{
try
{
//if (ApplicationConfig.PortName.Length < 3)
//{
// return;
//}
serialPort1.PortName = PortName; //端口号
serialPort1.BaudRate = BaudRate; //比特率,默认为9600
serialPort1.Parity = Parity.None;//奇偶校验
serialPort1.StopBits = StopBits.One;//停止位
serialPort1.ReadTimeout = ReadTimeout; //读超时,即在1000内未读到数据就引起超时异常
serialPort1.DtrEnable = true;
serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
OpenSerialPort();
}
catch (Exception err)
{
//ApplicationLog.WriteLog(err, err.Message);
}
finally
{
}
}
///
/// 关闭扫描枪
///
private void OpenSerialPortAll()
{
SetCOM1();
}
///
/// 打开扫描枪
///
private bool OpenSerialPort()
{
try
{
//if (ApplicationConfig.PortName.Length < 4)
//{
// return true;
//}
if (serialPort1 == null) return true;
if (!serialPort1.IsOpen)
{
serialPort1.Open();
SerialPort_Closing = false;
}
return true;
}
catch (Exception err)
{
//ApplicationLog.WriteLog(err, err.Message);
return false;
}
}
///
/// 关闭扫描枪
///
private bool CloseSerialPort()
{
try
{
//if (ApplicationConfig.PortName.Length < 4)
//{
// return true;
//}
if (serialPort1 == null) return true;
//根据当前串口对象,来判断操作
if (serialPort1.IsOpen)
{
SerialPort_Closing = true;
while (SerialPort_Listening) Application.DoEvents();
serialPort1.Close();
}
return true;
}
catch (Exception err)
{
//ApplicationLog.WriteLog(err, "CloseSerialPort");
return false;
}
}
///
/// 关闭扫描枪
///
private void CloseSerialPortAll()
{
CloseSerialPort();
}
///
/// 是否没有执行完invoke相关操作
///
private bool SerialPort_Listening = false;
///
/// 是否正在关闭串口,执行Application.DoEvents,
///
private bool SerialPort_Closing = false;
///
/// 处理手持扫描枪
/// 对于总线缸盖上线工位,扫描枪是固定扫描枪。(F102)
///
///
///
void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//byte[] readBuf;
//int HowTime = ApplicationConfig.HowTime;
//int ByteTime = ApplicationConfig.ByteTime;
string barCode;
//获取或设置一个值,该值在串行通信过程中启用数据终端就绪 (DTR) 信号。
//如果为 true,则启用数据终端就绪 (DTR);否则为 false。默认为 false。
bool DtrEnable = serialPort1.DtrEnable;
//如果已将数据设置就绪信号发送到该端口,则为 true;否则为 false。
bool DsrHolding = serialPort1.DsrHolding;
//如果端口处于中断状态,则为 true;否则为 false。
bool BreakState = serialPort1.BreakState; ;
if (SerialPort_Closing) return;
//如果正在关闭,忽略操作,直接返回, 尽快的完成串口监听线程的一次循环
try
{
//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。
SerialPort_Listening = true;
//20110225 zhangji
//获取扫描枪信息时加延时,否则可能无法完全读取扫描的信息
Thread.Sleep(200);
int n = serialPort1.BytesToRead;
byte[] buf = new byte[n];
//声明一个临时数组存储当前来的串口数据
serialPort1.Read(buf, 0, n);
n = n - ScannerTrim;
barCode = Encoding.UTF8.GetString(buf, 0, n);
BeginInvoke(barCodeInvoke, new Object[] { barCode });
}
catch (Exception err)
{
barCode = "";
//ApplicationLog.WriteLog(err, err.Message);
}
finally
{
//清空扫描枪缓冲区
serialPort1.DiscardInBuffer();
SerialPort_Listening = false;//我用完了,ui可以关闭串口了。
//最后用完了先关闭串口,然后再打开串口
CloseSerialPort();
OpenSerialPort();
}
}
///
/// 字符数组转字符串16进制
///
/// 二进制字节
/// 类似"01 02 0F"
public static string ByteToString(byte[] InBytes)
{
string StringOut = "";
foreach (byte InByte in InBytes)
{
StringOut = StringOut + String.Format("{0:X2}", InByte) + " ";
}
return StringOut.Trim();
}
///
/// strhex 转字节数组
///
/// 类似"01 02 0F" 用空格分开的
///
public static byte[] StringToByte_Int(string InString)
{
string[] ByteStrings;
ByteStrings = InString.Split("|".ToCharArray());
byte[] ByteOut;
ByteOut = new byte[ByteStrings.Length];
try
{
for (int i = 0; i <= ByteStrings.Length - 1; i++)
{
ByteOut[i] = byte.Parse(ByteStrings[i]);
}
}
catch (Exception err)
{
//ApplicationLog.WriteLog(err, err.Message);
}
return ByteOut;
}
///
/// strhex 转字节数组
///
/// 类似"01 02 0F" 用空格分开的
///
public static byte[] StringToByte(string InString)
{
string[] ByteStrings;
ByteStrings = InString.Split(" ".ToCharArray());
byte[] ByteOut;
ByteOut = new byte[ByteStrings.Length];
for (int i = 0; i <= ByteStrings.Length - 1; i++)
{
ByteOut[i] = byte.Parse(ByteStrings[i], System.Globalization.NumberStyles.HexNumber);
}
return ByteOut;
}
///
/// strhex 转字节数组
///
/// 类似"01 02 0F" 中间无空格
///
public static byte[] StringToByte_2(string InString)
{
byte[] ByteOut;
InString = InString.Replace(" ", "");
try
{
string[] ByteStrings = new string[InString.Length / 2];
int j = 0;
for (int i = 0; i < ByteStrings.Length; i++)
{
ByteStrings[i] = InString.Substring(j, 2);
j += 2;
}
ByteOut = new byte[ByteStrings.Length];
for (int i = 0; i <= ByteStrings.Length - 1; i++)
{
ByteOut[i] = byte.Parse(ByteStrings[i], System.Globalization.NumberStyles.HexNumber);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
return ByteOut;
}
///
/// 字符串 转16进制字符串
///
/// unico
/// 类似“01 0f”
public static string Str_To_0X(string InString)
{
return ByteToString(UnicodeEncoding.Default.GetBytes(InString));
}
}
}