111,044
社区成员
发帖
与我相关
我的任务
分享
int a=comm.ByteToRead;
byte []buf=new byte[a];
comm.Read(buf,0,a);
List <byte> list =new List<byte>() //必须定义为全局
int b=0
然后在private void comm_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
int a=comm.ByteToRead;
byte []buf=new byte[a];
comm.Read(buf,0,a);
for(i=0;i<a;i++)//用来将buf的数据拼接到list数组,以保证把完整的一帧数据加到一个数组里面
{
list.Insert(b,buf[i]);
b++;
}
if(list[list.account-1]==0xD0&&list[list.account-2]==0xDE)//判断数据是否收完;DE和D0为帧结束符在下面处理数据
{
对于第2个问题,利用LIST.Removerange(int ,length)//在指定索引处删除一定的长度
if(list[2]==0x08)
{
做相应处理;
list.removerange(0,6);
}
if(list[2]==0x55)
{
做相应处理;
list.removerange(0,6);
}
if(list[2]==0x66)
{
做相应处理;
}
list.Clear();//清空list用来下次接收
b=0;
}
}
详细的根据自己的通信协议按这个框架应该是可以的。
分享下,csdn就是分享知识的社区,yeah!private List<byte> RevBuffer = new List<byte>();
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
lock (RevBuffer)
{
var buffer = new byte[4000];
var len = 0;
while ((len = serialPort1.Read(buffer, 0, buffer.Length)) > 0)
RevBuffer.AddRange(buffer.Take(len));
ThreadPool.QueueUserWorkItem(h => //不等ProcessCommand执行完,立即重新读取串口新数据
{
while (ProcessCommand()) ; //处理收到的所有消息,直到再没有任务
});
}
}
private bool ProcessCommand()
{
lock (RevBuffer)
{
var len = 查找一个命令的长度(RevBuffer);
if (len == 0) //不包含任何完整的任务(比如说还没有接受到第一个消息的结束标志
return false;
var command = new byte[len];
Array.Copy( RevBuffer.ToArray() , command, len );
RevBuffer.RemoveRange(0, len ); //从接收缓冲区移除第一个消息内容
ThreadPool.QueueUserWorkItem(h => 执行一条命令(command));
return true; //通知调用程序,收到了一个任务
}
}