초기 커밋.
This commit is contained in:
283
LFP_Manager/Controls/ucSerialProcess.cs
Normal file
283
LFP_Manager/Controls/ucSerialProcess.cs
Normal file
@@ -0,0 +1,283 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Data;
|
||||
using System.Text;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
using DevExpress.XtraEditors;
|
||||
|
||||
using System.Threading;
|
||||
using System.IO.Ports;
|
||||
|
||||
using LFP_Manager.DataStructure;
|
||||
using LFP_Manager.Function;
|
||||
using LFP_Manager.Utils;
|
||||
|
||||
namespace LFP_Manager.Controls
|
||||
{
|
||||
public delegate void DataUpdate(object sender, DeviceSystemData[] aSystemData);
|
||||
|
||||
public partial class ucSerialProcess : DevExpress.XtraEditors.XtraUserControl
|
||||
{
|
||||
#region VARIABLES
|
||||
|
||||
DeviceSystemData[] SystemData;
|
||||
|
||||
//Thread serialComm = null;
|
||||
SerialPort sPort = null;
|
||||
//string CommPort = null;
|
||||
|
||||
bool SerialPortThreadEnd = false;
|
||||
|
||||
public event DataUpdate OnUpdate = null;
|
||||
|
||||
#endregion
|
||||
|
||||
#region CONSTRUCTORS
|
||||
|
||||
public ucSerialProcess(DeviceSystemData[] aSystemData)
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
SystemData = aSystemData;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region COMMPORT CONTROLS
|
||||
|
||||
private bool Open(string cPort, int cBaudrate)
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
sPort = new SerialPort();
|
||||
sPort.PortName = cPort;
|
||||
sPort.BaudRate = cBaudrate;
|
||||
|
||||
try
|
||||
{
|
||||
sPort.Open();
|
||||
|
||||
result = true;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private void Close()
|
||||
{
|
||||
if (sPort != null)
|
||||
{
|
||||
if (sPort.IsOpen)
|
||||
{
|
||||
sPort.Close();
|
||||
}
|
||||
sPort = null;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Serial Comm Thread
|
||||
|
||||
ushort RequestRegAddr = 0x0000;
|
||||
ushort RequestRegLen = 50;
|
||||
int SS, bakSS;
|
||||
|
||||
private int SerialTxProcess()
|
||||
{
|
||||
byte[] sData;
|
||||
|
||||
SS = DateTime.Now.Second;
|
||||
|
||||
if ((SS == 58) && (bakSS != SS))
|
||||
{
|
||||
// Write
|
||||
RequestRegAddr = 19;
|
||||
RequestRegLen = 5;
|
||||
sData = csSerialCommFunction.MakeWriteRegisterData(0xFF, RequestRegAddr, RequestRegLen);
|
||||
sPort.Write(sData, 0, sData.Length);
|
||||
bakSS = SS;
|
||||
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Read
|
||||
RequestRegAddr = 0x0000;
|
||||
RequestRegLen = 50;
|
||||
sData = csSerialCommFunction.MakeReadRegisterData(0x01, RequestRegAddr, RequestRegLen);
|
||||
sPort.Write(sData, 0, sData.Length);
|
||||
bakSS = SS;
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
#region Serial Buffering
|
||||
|
||||
private void PutBuff(byte c)
|
||||
{
|
||||
rBuffer[rBufStart++] = c;
|
||||
rBufStart %= BUFFER_SIZE;
|
||||
|
||||
if (rBufStart == rBufEnd)
|
||||
{
|
||||
rBufEnd++;
|
||||
rBufEnd %= BUFFER_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
private int GetBuff()
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
if (rBufStart != rBufEnd)
|
||||
{
|
||||
result = 0x0100 + rBuffer[rBufEnd++];
|
||||
rBufEnd %= BUFFER_SIZE;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
const int BUFFER_SIZE = 512;
|
||||
|
||||
byte[] rBuffer = new byte[BUFFER_SIZE];
|
||||
int rBufStart = 0;
|
||||
int rBufEnd = 0;
|
||||
|
||||
byte[] ReadBuf = new byte[BUFFER_SIZE];
|
||||
ushort rPosition = 0;
|
||||
bool Commfail = true;
|
||||
bool disCommfail = false;
|
||||
|
||||
ushort BTCU_ID = 1;
|
||||
|
||||
private void serialRecvThread()
|
||||
{
|
||||
int getData = 0;
|
||||
byte cData = 0;
|
||||
bool BuffStart = false;
|
||||
int TimeOutCount = 0;
|
||||
|
||||
while (SerialPortThreadEnd == false)
|
||||
{
|
||||
StartSend:
|
||||
if (sPort.IsOpen)
|
||||
{
|
||||
if (SerialTxProcess() == 1)
|
||||
{
|
||||
int rTimeOut = 100;
|
||||
|
||||
BuffStart = false;
|
||||
rPosition = 0;
|
||||
|
||||
while (rTimeOut > 0)
|
||||
{
|
||||
if (((getData = GetBuff()) & 0x0100) != 0x0000)
|
||||
{
|
||||
rTimeOut = 100;
|
||||
TimeOutCount = 0;
|
||||
|
||||
cData = (byte)(getData & 0x00FF);
|
||||
|
||||
if (rPosition >= BUFFER_SIZE)
|
||||
{
|
||||
BuffStart = false;
|
||||
rPosition = 0;
|
||||
}
|
||||
|
||||
if (BuffStart == false)
|
||||
{
|
||||
rPosition = 0;
|
||||
if (cData == 0x01)
|
||||
{
|
||||
ReadBuf[rPosition++] = cData;
|
||||
BuffStart = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ReadBuf[rPosition++] = cData;
|
||||
|
||||
switch (csSerialCommFunction.ModbusPacketFromSlaveCheck(ReadBuf, rPosition))
|
||||
{
|
||||
case 0: // Need more data
|
||||
break;
|
||||
case 1: // Packet OK, no error
|
||||
byte[] cdata = csUtils.StrToByteArray(ReadBuf, 0, rPosition - 2);
|
||||
|
||||
Commfail = false;
|
||||
SystemData[0] = csSerialCommFunction.SerialRxProcess(ReadBuf, RequestRegAddr, rPosition, SystemData[0]);
|
||||
|
||||
if (OnUpdate != null)
|
||||
{
|
||||
OnUpdate(this, SystemData);
|
||||
}
|
||||
|
||||
Thread.Sleep(100);
|
||||
|
||||
goto StartSend;
|
||||
case -1: // Packet error
|
||||
rPosition = 0;
|
||||
BuffStart = false;
|
||||
|
||||
Thread.Sleep(100);
|
||||
|
||||
goto StartSend;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Thread.Sleep(1);
|
||||
if (rTimeOut > 0) rTimeOut--;
|
||||
}
|
||||
}
|
||||
|
||||
if (rPosition > 0)
|
||||
{
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
else
|
||||
{
|
||||
TimeOutCount++;
|
||||
if (TimeOutCount >= 5)
|
||||
{
|
||||
TimeOutCount = 5;
|
||||
Commfail = true;
|
||||
}
|
||||
//if (Commfail == true)
|
||||
//{
|
||||
// BTCU_ID++;
|
||||
// BTCU_ID %= 31;
|
||||
// if (BTCU_ID == 0) BTCU_ID = 1;
|
||||
//}
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
rPosition = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
Thread.Sleep(500);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user