comm_DataReceived如果你这个是serialport的接收事件的话
他是会自动触发的,要看你的串口对象设置的多少字节触发该事件
你这样读也可以说没有问题,不过串口数据的处理一般是缓存,分析
第二个问题
调用comm_DataReceived(this,EventArgs.empty)
他是会自动触发的,要看你的串口对象设置的多少字节触发该事件
你这样读也可以说没有问题,不过串口数据的处理一般是缓存,分析
第二个问题
调用comm_DataReceived(this,EventArgs.empty)
我根据mervyn807的回复,用comm_DataReceived(this,EventArgs.Empty)调用该接收函数,爆出错误“无法从System.EventArgs转换为System.IO.Ports.SerialDataReceivedEventArgs)
这是为什么啊?
或者直接comm_DataReceived(null,null)试试
serialport 有个属性ReceivedBytesThreshold = 1;就是串口有1个字节
就触发接收事件进行数据读取,可以根据你的需要设置
发现如下:
我在原DataReceive函数里定义如下:
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
comm.Read(buf, 0, n);//读取缓冲数据
}
注:其中的buf是一个全局变量;调用时用comm_DataReceived(null,null)我用中断模式调试,发现转去执行DataReceive函数时,buf数组为有数据为正确的;
但是执行完DataReceive函数跳回来时,buf数组就自动清空了,数据全没了!!这是为何??
{ byte rev = (byte)PortHelper.SerialPort.ReadByte ();
switch ( PortHelper.RecFlag )
{
case 0:
{
if ( 0x7E == rev )
{
Net.RecLen = 0;
Net.DataReceiveBuffer[Net.RecLen++] = rev;
PortHelper.RecFlag = 1;
}
else
{
PortHelper.RecFlag = 0;
}
break;
}
case 1:
{
if ( 0x7E == rev )
{
Net.DataReceiveBuffer[Net.RecLen++] = rev;
PortHelper.RecFlag = 2;
}
else
{
PortHelper.RecFlag = 0;
}
break;
}
case 2:
{
Net.DataReceiveBuffer[Net.RecLen++] = rev;
if ( 13 == Net.RecLen )
{
Len = (UInt16)( ( Net.DataReceiveBuffer[11] & 0x0F * 0x100 ) + ( Net.DataReceiveBuffer[12] ) );
PortHelper.RecFlag = 3;
}
break;
}
case 3:
{
Net.DataReceiveBuffer[Net.RecLen++] = rev;
if ( Len + 17 == Net.RecLen )
{
GlobalVariable.TaskFlag = 0x40;
PortHelper.RecFlag = 0;
}
break;
} }
{ byte rev = (byte)PortHelper.SerialPort.ReadByte ();
switch ( PortHelper.RecFlag )
{
case 0:
{
if ( 0x7E == rev )
{
Net.RecLen = 0;
Net.DataReceiveBuffer[Net.RecLen++] = rev;
PortHelper.RecFlag = 1;
}
else
{
PortHelper.RecFlag = 0;
}
break;
}
case 1:
{
if ( 0x7E == rev )
{
Net.DataReceiveBuffer[Net.RecLen++] = rev;
PortHelper.RecFlag = 2;
}
else
{
PortHelper.RecFlag = 0;
}
break;
}
case 2:
{
Net.DataReceiveBuffer[Net.RecLen++] = rev;
if ( 13 == Net.RecLen )
{
Len = (UInt16)( ( Net.DataReceiveBuffer[11] & 0x0F * 0x100 ) + ( Net.DataReceiveBuffer[12] ) );
PortHelper.RecFlag = 3;
}
break;
}
case 3:
{
Net.DataReceiveBuffer[Net.RecLen++] = rev;
if ( Len + 17 == Net.RecLen )
{
GlobalVariable.TaskFlag = 0x40;
PortHelper.RecFlag = 0;
}
break;
} }
这就是方法!不过用的协议不一样!其中包头两个字节,数据长度用的是12位的,也就是Net.DataReceiveBuffer[11] & 0x0F * 0x100 ) + ( Net.DataReceiveBuffer[12]
然后再去判断是否接受完了!再去校验什么的!