Files
JP_KDDI_LFPS_48100/LFP_Manager/Controls/ucSerialProcess.cs
2025-12-19 13:59:34 +09:00

284 lines
8.1 KiB
C#

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
}
}