|
发表于 2021-9-18 08:31:38
|
显示全部楼层
public void MonitorRun() //异步的方式,接受优先级高
{
mReadThread = new Thread(new ThreadStart(delegate
{
int count;
int i;
byte[] rebuf = new byte[200];
int step = 0;
MonitorData data = new MonitorData();
mControl.Run();
Thread.Sleep(1000);
byte xor = 0;
byte [] cmd = new byte[2];
byte length = 0;
while (true)
{
if (mNeedClose)
{
mReadThread = null;
return;
}
count = this.BytesToRead;
if (count > 0)
{
this.Read(rebuf, 0, count);
for (i = 0; i < count; i++)
{
if (mNeedClose)
{
mReadThread = null;
return;
}
switch (step)
{
case 0:
if (rebuf == mReHead1)
{
step = 1;
xor = rebuf;
}
break;
case 1:
if (rebuf == mReHead2)
{
xor ^= rebuf;
step = 2;
}
else if (rebuf != mReHead1)
{
step = 1;
}
break;
case 2:
data.Unit = rebuf;
xor ^= rebuf;
step = 3;
break;
case 3:
if (rebuf == 0xFF)
{
xor ^= rebuf;
step = 4;
}
else
{
step = 0;
}
break;
case 4:
cmd[0] = rebuf;
xor ^= rebuf;
step = 5;
break;
case 5:
cmd[1] = rebuf;
data.CMD = (ECMD)BitConverter.ToUInt16(cmd, 0);
xor ^= rebuf;
step = 6;
break;
case 6:
length = rebuf;
data.Data.Clear();
xor ^= rebuf;
if (length > 0)
step = 7;
else
step = 8;
break;
case 7:
data.Data.Add(rebuf);
xor ^= rebuf;
if (data.Data.Count >= length)
{
step = 8;
}
break;
case 8:
if (xor == rebuf)
{
mControl.SendData(this,data);
}
step = 0;
break;
}
}
}
else
{
Thread.Sleep(1);
}
}
}));
mReadThread.IsBackground = true;
mReadThread.Start();
}
protected void CommadBase(byte unit, byte cmd, ReData reData, params byte[] datas)//同步的方式,发送优先级高,不需要使用事件
{
for (int i = 0; i < mRetry; i++)
{
mutex.WaitOne();
//lock (mKEY)
//{
this.SendData(unit, cmd, datas);
//Thread.Sleep(mDelay);
this.ReadData(unit, cmd, reData, mDelay);
mutex.ReleaseMutex();
//}
if (reData.ACKType == reData.ACKType_Normal)
{
return;
}
}
}
C#事件的机制是短时间里无法连续触发两次,实时性要求高的就会伤不起 |
|