110,571
社区成员
发帖
与我相关
我的任务
分享
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
//string FF = serialPort1.ReadTo("FF");
int num = serialPort1.BytesToRead;
byte[] MsgRec = new byte[num];
serialPort1.Read(MsgRec, 0, num);
//builder.Clear();
if (num >=10)
{
MsgRectextBox.AppendText("Recieved:" + "\r\n");
if (MsgRec[0] == 0xFF && MsgRec[2] != 0xFF && MsgRec[num-1] ==0xFF )//判断接收的帧是否符合协议,帧头帧尾
{
int Length = -1;
int i = 0;
MsgRecCount++;
MsgTransCount++;
while (MsgRec[8 + i] != 0xFF)//获取该帧长度
{
i++;
if (8 + i >= num)
break;
}
Length = Length + i + 10;
//byte[] MsgRec1 = new byte[1024 * 1024];
MsgRec = dataAnalyzer.ChangFE012FFFE002FE(MsgRec.Take(Length).ToArray());
string result = dataAnalyzer.ToHexString(MsgRec);
MsgRectextBox.AppendText(result + "\r\n");
//其他处理接收帧代码,及时响应;
}
}
}
int dataLen = 0;//有效数据长度
byte[] buff = new byte[256];//分配一个足够大的缓冲区,
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
int num = serialPort1.BytesToRead;
if (num + dataLen > buff.Length) num = buff.Length - dataLen;//防止数据溢出(其实有点多余,缓冲区已经足够大了,就算是115200的波特率也不可能爆缓冲)
serialPort1.Read(buff, dataLen, num);
dataLen += num;
if (dataLen >= 10)//如果你是定长帧这个是没问题的,否则.....呵呵
{
byte[] data = new byte[dataLen];
Buffer.BlockCopy(buff, 0, data, 0, dataLen);//复制有效数据
dataLen = 0;
Action<byte[]> a = new Action<byte[]>(showData);
a.BeginInvoke(data, null, null);//异步处理数据(显示数据)
}
}
void showData(byte[] data)
{
//因为这个函数是异步执行的,因有操作UI控件,所以必须与UI线程同步
if (this.InvokeRequired)
{
this.Invoke(new Action<byte[]>(showData), data);//使用UI线程调用这个函数
return;
}
//下面是处理(显示)过程,
MsgRectextBox.AppendText("Recieved:" + "\r\n");
if (data[0] == 0xFF && data[2] != 0xFF && data[data.Length - 1] == 0xFF)//判断接收的帧是否符合协议,帧头帧尾
{
int Length = -1;
int i = 0;
MsgRecCount++;
MsgTransCount++;
while (data[8 + i] != 0xFF)//获取该帧长度
{
i++;
if (8 + i >= data.Length)
break;
}
Length = Length + i + 10;
//byte[] MsgRec1 = new byte[1024 * 1024];
data = dataAnalyzer.ChangFE012FFFE002FE(data.Take(Length).ToArray());
string result = dataAnalyzer.ToHexString(data);
MsgRectextBox.AppendText(result + "\r\n");
}
}
private void sp_WT230_DataReceived(byte[] data)
{
buffer_wt230.AddRange(data);
if (buffer_wt230.Find(d => d == 0x0d) != 0)
{
byte[] ReceiveBytes = new byte[buffer_wt230.FindIndex(d => d == 0x0d)];
buffer_wt230.CopyTo(0, ReceiveBytes, 0, ReceiveBytes.Length);
buffer_wt230.Clear();
}
一个全局的list<byte> buffer_wt230
每次都累加然后判断 是否有尾.(在上面代码中 我的协议是已0x0d结尾的)
然后最终通过解析 得到一个ReceiveBytes 这个就是 一组合法的数据.
当然这只是其中的一种办法..不过大体都是根据协议来下手