148 lines
4.2 KiB
C#
148 lines
4.2 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Text;
|
|||
|
using System.IO.Ports;
|
|||
|
using System.Data;
|
|||
|
using DBFactory;
|
|||
|
namespace SimensSerialPort
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>
|
|||
|
/// </summary>
|
|||
|
public class PortDataReciveEventArgs : EventArgs
|
|||
|
{
|
|||
|
private byte[] _data;
|
|||
|
public byte[] Data
|
|||
|
{
|
|||
|
get { return _data; }
|
|||
|
set { _data = value; }
|
|||
|
}
|
|||
|
public PortDataReciveEventArgs()
|
|||
|
{
|
|||
|
this._data = null;
|
|||
|
}
|
|||
|
|
|||
|
public PortDataReciveEventArgs(byte[] data)
|
|||
|
{
|
|||
|
this._data = data;
|
|||
|
}
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// <20>йܵĴ<DCB5><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>ľ<EFBFBD><C4BE><EFBFBD>
|
|||
|
/// </summary>
|
|||
|
/// <param name="sender"></param>
|
|||
|
/// <param name="e"></param>
|
|||
|
public delegate void PortDataReceivedEventHandle(object sender, PortDataReciveEventArgs e);
|
|||
|
/// <summary>
|
|||
|
/// <20><><EFBFBD><EFBFBD>ͨѶ<CDA8><D1B6>
|
|||
|
/// </summary>
|
|||
|
public class PortData
|
|||
|
{
|
|||
|
public event PortDataReceivedEventHandle Received;
|
|||
|
public event SerialErrorReceivedEventHandler Error;
|
|||
|
public SerialPort port;
|
|||
|
public volatile bool ReceiveEventFlag = false; //<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>Ƿ<EFBFBD><C7B7><EFBFBD>Ч false<73><65>ʾ<EFBFBD><CABE>Ч
|
|||
|
DBOperator dbo = new DBOperator();
|
|||
|
//int _fid, mti;
|
|||
|
public PortData(string sPortName, int baudrate, Parity parity)
|
|||
|
{
|
|||
|
port = new SerialPort(sPortName, baudrate, parity, 8, StopBits.One);
|
|||
|
port.WriteBufferSize = 4096;
|
|||
|
port.RtsEnable = true;
|
|||
|
port.ReadTimeout = 3000;
|
|||
|
port.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
|
|||
|
port.ErrorReceived += new SerialErrorReceivedEventHandler(ErrorEvent);
|
|||
|
//DataReceived <20>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>뻺<EFBFBD><EBBBBA><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ֽ<EFBFBD><D6BD><EFBFBD>
|
|||
|
port.ReceivedBytesThreshold = 16;
|
|||
|
dbo.Open();
|
|||
|
}
|
|||
|
|
|||
|
~PortData()
|
|||
|
{
|
|||
|
Close();
|
|||
|
}
|
|||
|
public void Open()
|
|||
|
{
|
|||
|
if (!port.IsOpen)
|
|||
|
{
|
|||
|
port.Open();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void Close()
|
|||
|
{
|
|||
|
if (port.IsOpen)
|
|||
|
{
|
|||
|
port.Close();
|
|||
|
}
|
|||
|
}
|
|||
|
//<2F><><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>
|
|||
|
public void SendData(byte[] data)
|
|||
|
{
|
|||
|
if (port.IsOpen)
|
|||
|
{
|
|||
|
port.Write(data, 0, data.Length);
|
|||
|
}
|
|||
|
}
|
|||
|
public void SendData(byte[] data, int offset, int count)
|
|||
|
{
|
|||
|
if (port.IsOpen)
|
|||
|
{
|
|||
|
port.Write(data, offset, count);
|
|||
|
}
|
|||
|
}
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
public int SendCommand(byte[] SendData, ref byte[] ReceiveData, int Overtime)
|
|||
|
{
|
|||
|
if (port.IsOpen)
|
|||
|
{
|
|||
|
ReceiveEventFlag = true; //<2F>رս<D8B1><D5BD><EFBFBD><EFBFBD>¼<EFBFBD>
|
|||
|
port.DiscardInBuffer(); //<2F><><EFBFBD>ս<EFBFBD><D5BD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
port.DiscardOutBuffer(); //<2F><><EFBFBD>շ<EFBFBD><D5B7>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
port.Write(SendData, 0, SendData.Length);
|
|||
|
int num = 0, ret = 0;
|
|||
|
|
|||
|
while (num++ < Overtime)
|
|||
|
{
|
|||
|
if (port.BytesToRead >= ReceiveData.Length) break;
|
|||
|
System.Threading.Thread.Sleep(1);
|
|||
|
}
|
|||
|
|
|||
|
if (port.BytesToRead >= ReceiveData.Length)
|
|||
|
ret = port.Read(ReceiveData, 0, ReceiveData.Length);
|
|||
|
ReceiveEventFlag = false; //<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
|||
|
return ret;
|
|||
|
}
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
public void ErrorEvent(object sender, SerialErrorReceivedEventArgs e)
|
|||
|
{
|
|||
|
if (Error != null) Error(sender, e);
|
|||
|
}
|
|||
|
//<2F><><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>
|
|||
|
public void DataReceived(object sender, SerialDataReceivedEventArgs e)
|
|||
|
{
|
|||
|
//<2F><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>ʱֱ<CAB1><D6B1><EFBFBD>˳<EFBFBD>
|
|||
|
if (ReceiveEventFlag) return;
|
|||
|
//<2F>Ƿ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>DataReceived <20>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>뻺<EFBFBD><EBBBBA><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ֽ<EFBFBD><D6BD><EFBFBD>
|
|||
|
//ReceivedBytesThreshold = 16<31><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>port.BytesToRead<61><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
byte[] data = new byte[port.BytesToRead];
|
|||
|
port.Read(data, 0, data.Length);
|
|||
|
if (Received != null)
|
|||
|
{
|
|||
|
Received(sender, new PortDataReciveEventArgs(data));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public bool IsOpen()
|
|||
|
{
|
|||
|
return port.IsOpen;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|