using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace VNABLL
{
public class Comm
{
public delegate void EventHandle(string readBuffer);
public event EventHandle DataReceived;
private SerialPort serialPort;
Thread thread;
volatile bool _keepReading;
public Comm()
{
if (serialPort == null)
{
serialPort = new SerialPort("COM3", 9600);
this.serialPort.DiscardNull = true;
this.serialPort.ReadTimeout = 10;
this.serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
}
thread = null;
_keepReading = false;
}
public bool IsOpen
{
get
{
return serialPort.IsOpen;
}
}
private void StartReading()
{
if (!_keepReading)
{
_keepReading = true;
thread = new Thread(new ThreadStart(ReOpen));
thread.Start();
}
}
private void StopReading()
{
if (_keepReading)
{
_keepReading = false;
thread.Join();
thread = null;
}
}
readonly object obj = new object();
public void Open()
{
Close();
serialPort.Open();
if (serialPort.IsOpen)
{
StartReading();
}
else
{
MessageBox.Show("串口打开失败!");
}
}
public void Close()
{
StopReading();
serialPort.Close();
}
public bool WritePort(string sendMsg)
{
bool flag = false;
try
{
if (serialPort.IsOpen)
{
serialPort.Write(sendMsg);
flag = true;
}
else
{
flag = false;
}
}
catch
{
flag = false;
}
return flag;
}
string str = "";
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (serialPort.IsOpen)
{
System.Threading.Thread.Sleep(300);
int count = serialPort.BytesToRead;
if (count > 0)
{
byte[] readBuffer = new byte[count];
try
{
serialPort.Read(readBuffer, 0, count);
if (string.IsNullOrEmpty(str))
str = System.Text.Encoding.Default.GetString(readBuffer);
else
str += System.Text.Encoding.Default.GetString(readBuffer);
if (str.Contains("@XJ1") && str.Contains("#"))
{
if (DataReceived != null)
DataReceived(str);
str = "";
serialPort.DiscardInBuffer();
}
if (str.Contains("@HJ1") && str.Contains("#"))
{
if (DataReceived != null)
DataReceived(DecodeFire(readBuffer));
str = "";
serialPort.DiscardInBuffer();
}
string DecodeFire(byte[] fetchbyte)
{
string head = str.Substring(0, 4);
string end = str.Substring(29, 1);
int x = (int)fetchbyte[4];
string[] decs = new string[24];
for (int i = 5; i < fetchbyte.Length - 1; i++)
{
int deci = (int)fetchbyte[i] - x + 9;
//Array.Copy(System.Text.ASCIIEncoding.Default.GetBytes(deci.ToString()), 0, Bufferx, 0, 1);
//decs[i-5] = System.Text.Encoding.ASCII.GetString(Bufferx);
decs[i - 5] = deci.ToString();
}
string sr = String.Join("", decs);
string declast = head + sr + end;
return declast;
}
}
catch (TimeoutException)
{
}
}
}
}
private void ReOpen()
{
while (_keepReading)
{
Close();
serialPort.Open();
}
}
}
}