16,548
社区成员




private NetworkStream _peerStream; //C#中NetworkStream, 用VC中哪个类代替
//数据接收函数---------------------------
private void RecvThreadProc(object state)
{
try
{
while (_peerStream.DataAvailable)
{
_peerStream.Read(new byte[1024], 0, 1024);
}
_peerStream.Write(new byte[] {0xfe, 0xb7 + 1, 0xa0}, 0, 3); //开始发送指令
SaveIndexInfoTop();
_currentState = State.Working;
UpdateStateUI();
while (_isRunning) //运行中
{
var bytes = new byte[1024];
int len = _peerStream.Read(bytes, 0, 1024); //从流中读取缓冲字节数组
if (len == 0)
throw new IOException("Link Lost");
for (int i = 0; i < len; i++)
{
_recvqueue.Enqueue(bytes[i]);
}
while (_recvqueue.Count >= 22)
{
if (_recvqueue.Dequeue() != 0xe0)
{
break;
}
byte dataCountLoLo = _recvqueue.Dequeue();
byte dataCountLoHi = _recvqueue.Dequeue();
byte dataCountHiLo = _recvqueue.Dequeue();
byte dataCountHiHi = _recvqueue.Dequeue();
var framecount =
(uint)((dataCountHiHi << 24) + (dataCountHiLo << 16) + (dataCountLoHi << 8) + dataCountLoLo);
var checksum = (byte)(dataCountLoLo + dataCountLoHi + dataCountHiLo + dataCountHiHi);
var channeltmp = new int[8];
for (int i = 0; i < 8; i++)
{
byte tmpL = _recvqueue.Dequeue();
byte tmpH = _recvqueue.Dequeue();
checksum = (byte) (checksum + tmpL + tmpH);
//Console.WriteLine("{0}",checksum);
//Console.WriteLine("{0}", tmpL);
//Console.WriteLine("{0}", tmpH);
channeltmp[i] = (tmpH << 8) + tmpL;
}
if (_recvqueue.Dequeue() != checksum)
{
break;
}
var channel = new int[6];
channel[0] = channeltmp[2];
channel[1] = channeltmp[0];
channel[2] = channeltmp[3];
channel[3] = channeltmp[1];
channel[4] = channeltmp[5];
channel[5] = channeltmp[4];
lock (_channelqueue)
{
while (framecount - _frameRecvCount - 1 > 0)
{
_channelqueue.Enqueue(null);
_frameRecvCount++;
}
_channelqueue.Enqueue(channel);
_frameRecvCount++;
_channelEvent.Set();
}
if (framecount%_samplingFreq == 0)
{
_peerStream.Write(new byte[] {0xfe, 0xb7 + 1, 0xa3}, 0, 3); //breath cmd
}
}
}
_peerStream.Write(new byte[] {0xfe, 0xb7 + 1, 0xa1}, 0, 3); //停止发送指令
_channelEvent.Set();
_calcStopEvent.WaitOne();
SaveIndexInfoBottom("User stop");
_currentState = State.Idle;
Invoke(new Action(UpdateStateUI));
}
catch (Exception ex)
{
LinkLost();
MessageBox.Show(ex.Message);
}
}
//打开串口
m_mscommctl.put__CommPort(com); //选择COM
m_mscommctl.put_InBufferSize(10240); //接收缓冲区
m_mscommctl.put_OutBufferSize(10240); //发送缓冲区
m_mscommctl.put_InputMode(1); //以二进制方式读写数据
m_mscommctl.put_Settings(_T("9600,N,8,1")); //波特率9600无检验位,8个数据位,1个停止位
m_mscommctl.put_InputLen(0); //设置当前接收区数据长度为0,表示全部读取
m_mscommctl.put_RThreshold(1024); //接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
m_mscommctl.put_SThreshold(4096);
if (!m_mscommctl.get_PortOpen())
{
m_mscommctl.put_PortOpen(TRUE);
}
//发送数据
CByteArray aa;
aa.RemoveAll();
aa.SetSize(len);
for(int i =0; i < len; i++)
aa.SetAt(i, buf[i]);
m_mscommctl.put_Output(COleVariant(aa));
AppendContent(1, mf.ToCString("Send OK ! bytes = %d", len - 1));
//接收数据
if (m_mscommctl.get_CommEvent() == 2) //事件值为2表示接受缓冲区内有字符
{
VARIANT variant_inp = m_mscommctl.get_Input(); ////读缓冲区
COleSafeArray safearray_inp = variant_inp;
len = safearray_inp.GetOneDimSize(); //有效数据长度
BYTE rxdata[2048]; //设置BYTE数组
mf.ClearArray(rxdata, 2048, (BYTE)'\0');
for(LONG i = 0; i < len; i++)
{
safearray_inp.GetElement(&i, rxdata + i); //转换为BYTE型数组
}
AppendContent(1, mf.ToCString("接收%d字节: ", len), FALSE);
AppendContent(1, (char*)rxdata);
m_countnum[1] += len;
UpdateCountNum();
}
_peerStream.Write(new byte[] {0xfe, 0xb7 + 1, 0xa0}, 0, 3); //开始发送指令