275 lines
8.5 KiB
C#
275 lines
8.5 KiB
C#
#define CONSOLE_DBUGGING
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using System.Collections;
|
|
|
|
namespace ITC81DB_0H.SerialManager
|
|
{
|
|
public partial class SerialMgrComm
|
|
{
|
|
public delegate void ObjectEventHandler(object data);
|
|
public static event ObjectEventHandler SerialPortMessageReceive;
|
|
public static event ObjectEventHandler SerialPortErrMessageReceive;
|
|
|
|
public static void IntializeSerialManager()
|
|
{
|
|
//Console.Write("Initialize Serial Manager \n");
|
|
|
|
// Register Callback
|
|
fnSerialMgrDebugCallback = serialDebugCallback;
|
|
DLL_SerialMgr_Register_DebugCB(fnSerialMgrDebugCallback);
|
|
|
|
fnSerialMgrPortConnectCallback = serialPortConnectCallback;
|
|
DLL_SerialMgr_Register_ConnectCB(fnSerialMgrPortConnectCallback);
|
|
|
|
fnSerialVersionCallback = serialVersionCallback;
|
|
DLL_SerialMgr_Register_VersionCB(fnSerialVersionCallback);
|
|
|
|
fnSerialMgrRcvPacketCallback = serialRcvPacketMsgCallback;
|
|
DLL_SerialMgr_Register_RcvPacketCB(fnSerialMgrRcvPacketCallback);
|
|
|
|
fnSerialMgrRcvErrPacketCallback = serialRcvErrPacketMsgCallback;
|
|
DLL_SerialMgr_Register_RcvErrPacketCB(fnSerialMgrRcvErrPacketCallback);
|
|
|
|
// test
|
|
//DLL_SerialMgr_HelloWorld();
|
|
|
|
// get the lib version
|
|
DLL_SerialMgr_Getversion();
|
|
|
|
// activate the dll thread
|
|
DLL_SerialMgr_Activation();
|
|
|
|
}
|
|
|
|
#region DLL_CALLBACK
|
|
private static void serialVersionCallback(StringBuilder versionInfo)
|
|
{
|
|
try
|
|
{
|
|
//Console.Write("\n-------------------------------\n");
|
|
//Console.Write("lib version = " + versionInfo + "\n");
|
|
//Console.Write("-------------------------------\n");
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
throw (e);
|
|
}
|
|
}
|
|
|
|
private static void serialPortConnectCallback(StringBuilder commPort, int status, int errDetail)
|
|
{
|
|
try
|
|
{
|
|
//Console.Write(commPort + ": status = " + status.ToString() +" , detail = " + errDetail.ToString() + "\n");
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
throw (e);
|
|
}
|
|
}
|
|
|
|
private static void serialDebugCallback(int type, StringBuilder pMessage)
|
|
{
|
|
try
|
|
{
|
|
//Console.Write(pMessage);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
throw (e);
|
|
}
|
|
}
|
|
|
|
// https://stackoverflow.com/questions/22938756/how-to-marshal-c-array-to-c-sharp-via-intptr
|
|
public static void serialRcvPacketMsgCallback(StringBuilder commPort, IntPtr pData, int length)
|
|
{
|
|
try
|
|
{
|
|
if (commPort.Length == 0)
|
|
return;
|
|
|
|
if ( (pData == IntPtr.Zero) || (length == 0) )
|
|
return;
|
|
|
|
byte[] data = new byte[length];
|
|
Marshal.Copy(pData, data, 0, (int)length);
|
|
|
|
string sdata = Encoding.Default.GetString(data, 0, data.Length);
|
|
|
|
if (SerialPortMessageReceive != null)
|
|
SerialPortMessageReceive(sdata);
|
|
|
|
#if TEST_CB
|
|
String commPortStr = commPort.ToString();
|
|
|
|
serialPortMessageByte(commPortStr, data, length);
|
|
#endif
|
|
|
|
|
|
//Console.Write("comm port : " + commPort + ", length = " + length.ToString() + "\n");
|
|
#if TEST_DEBUG
|
|
// https://stackoverflow.com/questions/1342922/console-writeline-as-hexadecimal
|
|
int index = 0;
|
|
foreach (byte temp in data)
|
|
{
|
|
Console.Write(temp.ToString("X2") + " ");
|
|
index++;
|
|
|
|
if (index % 16 == 0) Console.Write("\n");
|
|
}
|
|
|
|
Console.Write("\n");
|
|
#endif
|
|
|
|
//data = null;
|
|
|
|
//GC.Collect();
|
|
//GC.WaitForPendingFinalizers();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
throw (e);
|
|
}
|
|
}
|
|
|
|
public static void serialRcvErrPacketMsgCallback(StringBuilder commPort, IntPtr pData, int length)
|
|
{
|
|
try
|
|
{
|
|
if (commPort.Length == 0)
|
|
return;
|
|
|
|
if ((pData == IntPtr.Zero) || (length == 0))
|
|
return;
|
|
|
|
byte[] data = new byte[length];
|
|
Marshal.Copy(pData, data, 0, (int)length);
|
|
|
|
string sdata = Encoding.Default.GetString(data, 0, data.Length);
|
|
|
|
if (SerialPortErrMessageReceive != null)
|
|
SerialPortErrMessageReceive(sdata);
|
|
|
|
//String commPortStr = commPort.ToString();
|
|
//serialPortMessageByte(commPortStr, data, length);
|
|
|
|
//Console.Write("Err : comm port : " + commPort + ", length = " + length.ToString() + "\n");
|
|
|
|
#if (TEST_DEBUG1)
|
|
// https://stackoverflow.com/questions/1342922/console-writeline-as-hexadecimal
|
|
int index = 0;
|
|
foreach (byte temp in data)
|
|
{
|
|
Console.Write(temp.ToString("X2") + " ");
|
|
index++;
|
|
|
|
if (index == 5) break;
|
|
|
|
if (index % 16 == 0) Console.Write("\n");
|
|
}
|
|
|
|
Console.Write("\n");
|
|
#endif
|
|
|
|
// https://dhshin94.tistory.com/135
|
|
//data = null;
|
|
|
|
//GC.Collect();
|
|
//GC.WaitForPendingFinalizers();
|
|
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
throw (e);
|
|
}
|
|
}
|
|
|
|
#endregion // DLL_CALLBACK
|
|
|
|
#region DLL_COMMAND
|
|
|
|
public static void serialPortOpen(String commPort, int BaudRate, int stopBit, int parity, int dataBit)
|
|
{
|
|
IntPtr pCommPort = Marshal.StringToBSTR(commPort.ToString());
|
|
|
|
DLL_SerialMgr_PortOpen(pCommPort, BaudRate, stopBit, parity, dataBit);
|
|
}
|
|
|
|
public static void serialPortClose(String commPort)
|
|
{
|
|
IntPtr pCommPort = Marshal.StringToBSTR(commPort.ToString());
|
|
|
|
DLL_SerialMgr_PortClose(pCommPort);
|
|
}
|
|
|
|
|
|
public static void serialPortMessageByte(String commport, byte[] data, int length)
|
|
{
|
|
IntPtr pCommPort = Marshal.StringToBSTR(commport.ToString());
|
|
|
|
IntPtr ptr = Marshal.AllocHGlobal(length);
|
|
Marshal.Copy(data, 0, ptr, length);
|
|
|
|
DLL_SerialMgr_PortSendMsg(pCommPort, ptr, length);
|
|
|
|
//string sdata = Encoding.Default.GetString(data, 0, data.Length);
|
|
|
|
Marshal.FreeHGlobal(ptr);
|
|
|
|
// if (SerialPortMessageReceive != null)
|
|
// SerialPortMessageReceive(sdata);
|
|
}
|
|
|
|
|
|
//https://stackoverflow.com/questions/13418795/convert-byte-array-to-structure-in-the-compact-framework
|
|
public static void serialPortMessage(String commPort, String Message)
|
|
{
|
|
IntPtr pCommPort = Marshal.StringToBSTR(commPort.ToString());
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.Append((char)0x02);
|
|
sb.Append(Message);
|
|
sb.Append((char)0x03);
|
|
|
|
Message = sb.ToString();
|
|
|
|
byte[] buffer = Encoding.ASCII.GetBytes(Message);
|
|
int count = Encoding.ASCII.GetByteCount(Message);
|
|
//byte[] buffer = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
|
|
//int count = 10;
|
|
|
|
IntPtr ptr = Marshal.AllocHGlobal(count);
|
|
Marshal.Copy(buffer, 0, ptr, count);
|
|
|
|
DLL_SerialMgr_PortSendMsg(pCommPort, ptr, count);
|
|
|
|
Marshal.FreeHGlobal(ptr);
|
|
}
|
|
|
|
public static void serialPortMessageRaw(String commPort, String Message)
|
|
{
|
|
IntPtr pCommPort = Marshal.StringToBSTR(commPort.ToString());
|
|
|
|
byte[] buffer = Encoding.ASCII.GetBytes(Message);
|
|
int count = Encoding.ASCII.GetByteCount(Message);
|
|
//byte[] buffer = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
|
|
//int count = 10;
|
|
|
|
IntPtr ptr = Marshal.AllocHGlobal(count);
|
|
Marshal.Copy(buffer, 0, ptr, count);
|
|
|
|
DLL_SerialMgr_PortSendMsg(pCommPort, ptr, count);
|
|
|
|
Marshal.FreeHGlobal(ptr);
|
|
}
|
|
#endregion
|
|
|
|
}
|
|
}
|