|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace parse
{
public class SerialParse
{
//串口接收结构体
public struct dsRxCtrl
{
public uint rxCnt;
public uint rxLen;
public byte rxState;
public byte[] buf;
}
//构造函数
public SerialParse()
{
m_rxCtrl.buf = new byte[1000];
m_rxCtrl.rxCnt = 0;
m_rxCtrl.rxLen = 0;
m_rxCtrl.rxState = 0;
}
//串口接收
public dsRxCtrl m_rxCtrl;
public byte get_xor(byte[] data, int len)
{
byte check = 0;
if (len == 0) return 0;
check = data[0];
for (int i = 1; i < len; i++)
{
check ^= data[i];
}
return check;
}
//串口接收解析
//head (1 byte) cmd (1 byte) fun(1 byte) len(1byte) data ( n byte ) check (1 byte, xor) tail ( 1 byte )
public bool parse_recv(byte temp, out byte[] byteArray)
{
bool ret = false;
byteArray = new byte[1000];
if (m_rxCtrl.rxCnt < 200)
{
m_rxCtrl.buf[m_rxCtrl.rxCnt++] = temp;
}
switch (m_rxCtrl.rxState)
{
case 0:
if (temp == 0xa5)
{
m_rxCtrl.rxState = 1;
m_rxCtrl.rxCnt = 1;
m_rxCtrl.buf[0] = temp;
}
else
{
m_rxCtrl.rxCnt = 0;
m_rxCtrl.rxLen = 0;
m_rxCtrl.rxState = 0;
}
break;
case 1://head
if (temp == 0xa5)
{
m_rxCtrl.rxState = 1;
m_rxCtrl.rxCnt = 1;
m_rxCtrl.buf[0] = temp;
}
else
{
m_rxCtrl.rxState = 2;//cmd
}
break;
case 2:
m_rxCtrl.rxState = 3;//fun
break;
case 3://len
m_rxCtrl.rxLen = temp;
m_rxCtrl.rxState = 4;
break;
case 4:
if (m_rxCtrl.rxCnt >= (m_rxCtrl.rxLen + 6))
{
if (m_rxCtrl.buf[m_rxCtrl.rxLen + 6 - 1] == 0x0d)
{
int len = (int)(m_rxCtrl.rxLen) + 4;
byte check = get_xor(m_rxCtrl.buf, len);
if (check != m_rxCtrl.buf[m_rxCtrl.rxLen + 6 - 2])
{
Console.WriteLine("check err");
}
else
{
byteArray = new byte[m_rxCtrl.rxLen + 6];
for( int i = 0; i< m_rxCtrl.rxLen+6; i++ )
{
byteArray[i] = m_rxCtrl.buf[i];
}
ret = true;
}
}
else
{
Console.WriteLine("recv err frame ?");
}
m_rxCtrl.rxCnt = 0;
m_rxCtrl.rxLen = 0;
m_rxCtrl.rxState = 0;
}
break;
default:
break;
}//end switch
return ret;
}//end fun
}//end class
}
写了一个解析类,
从c转过来的代码,通过状态机解析串口数据是否符合协议,如果是,就通过out将完整的数据帧传出去,让上层处理。
才学两天,对out ref理解可能不是很到位。 没有c里面指针那种方式,有点适应不过来。
串口协议格式:
//head (1 byte) cmd (1 byte) fun(1 byte) len(1byte) data ( N byte ) check (1 byte, xor) tail ( 1 byte )
实际有效长度由len字段决定,属于不定长数据接收。
大家给点意见。
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|