Files
vms2016_kadisp/Sub/arMasterK/Project/Write.cs

214 lines
6.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.ComponentModel;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Design;
using System.Reflection;
using System.Runtime;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
//for tcp,udp
using System.Net.Sockets;
using System.Net;
namespace arDev
{
public partial class MasterK
{
protected Boolean Send(byte[] packet)
{
try
{
_device.DiscardInBuffer();
System.Threading.Thread.Sleep(1);
_device.DiscardOutBuffer();
System.Threading.Thread.Sleep(1);
_device.Write(packet, 0, packet.Length);
char_tmo = 0;
return true;
}
catch (Exception ex)
{
RaiseMessage(true, "Device Send Error : " + ex.Message);
return false;
}
}
protected Boolean Write(byte[] packet)
{
bSyncRecvOK = false;
errorMessage = string.Empty;
lastSendTime = DateTime.Now;
lastSendMessage = Parse_SendBuffer(packet);
Boolean retval = Send(packet);
if (!retval) RaiseMessage(true, "Tx Error : " + System.Text.Encoding.Default.GetString(packet));
else RaiseDataMessage(eMsgType.Tx, packet);
return retval;
}
public byte[] UserWrite(string command)
{
_mre.Reset();
var buffer = WriteSync(command);
_mre.Set();
return buffer;
}
protected byte[] WriteSync(string command)
{
var bytes = System.Text.Encoding.Default.GetBytes(command);
if (command[0] == (char)wSTX)
{
return WriteSync(bytes);
}
else
{
List<byte> packet = new List<byte>();
packet.Add(wSTX);
packet.AddRange(bytes);
packet.Add(wETX);
return WriteSync(packet.ToArray());
}
}
protected int interframe_delay;
System.Diagnostics.Stopwatch sw_ch;
long char_tmo;
string savefil = string.Empty;
// Int64 writeCnt = 0;
protected byte[] WriteSync(byte[] command)
{
//writeCnt += 1;
//RaiseMessage(false, ">> WriteSync Enter " + writeCnt.ToString());
if (savefil == "")
{
savefil = Environment.CurrentDirectory + "\rxBuffer.txt";
}
// if (!mre.WaitOne(500))
// {
// errorMessage = "WaitOne error 500ms";
// return null;
// }
//// RaiseMessage(false, "write data sync");
// mre.Reset();
//Boolean isComplete = false;
Boolean isTimeOut = false;
errorMessage = "Wait Data #2";
LastRecvMessage.Clear();
List<byte> _buffer = new List<byte>();
wat.Restart();
System.Threading.Thread.Sleep(interframe_delay);
//send data
if (!Write(command))
{
errorMessage = "sync Buffer is null(1)";
//mre.Set();
//RaiseMessage(false, "<< WriteSync Out " + writeCnt.ToString());
return null;
}
bool done = false;
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
int rcv ;
long tmo = 0;
do
{
int buffercnt = 0;
try
{
buffercnt = _device.BytesToRead;
}
catch (Exception ex)
{
RaiseMessage(true, ex.Message);
}
if (buffercnt > 0)
{
try
{
rcv = _device.ReadByte();
// System.IO.File.WriteAllBytes(savefil, new byte[] { (byte)rcv });
RaiseDataMessage(eMsgType.RxRaw, new byte[(byte)rcv]);
if (rcv == 0x06 || rcv == 0x015)
{
_buffer.Clear();
_buffer.Add((byte)rcv);
//isComplete = false;
}
else if (rcv == 0x03) //endtext
{
//모두 수신한경우이다.
_buffer.Add((byte)rcv);
//isComplete = true;
done = true;
break;
}
else
{
_buffer.Add((byte)rcv);
}
}
catch {
}
}
tmo = sw.ElapsedMilliseconds;
} while ((!done) && (_device.ReadTimeout > tmo));
sw_ch.Stop();
sw.Stop();
if (tmo >= _device.ReadTimeout)
{
errorMessage = string.Format("Writesync TimeOut({0})", _device.ReadTimeout);
isTimeOut = true;
}
byte[] Dummy = new byte[_buffer.Count];
_buffer.CopyTo(Dummy);
// mre.Set();
if (isTimeOut)
{
RaiseMessage(true, errorMessage);
//RaiseMessage(false, "<< WriteSync Out " + writeCnt.ToString());
return null;
}
else
{
RaiseDataMessage(eMsgType.Rx, Dummy);
var frame = Parse_RecvBuffer(Dummy);
if (frame.Buffer == null)
{
errorMessage = "sync buffer is null(2)";
RaiseMessage(true, errorMessage);
// RaiseMessage(false, "<< WriteSync Out " + writeCnt.ToString());
return null;
}
else
{
// RaiseMessage(false, "<< WriteSync Out " + writeCnt.ToString());
return frame.Buffer;
}
}
}
}
}