comm_DataReceived如果你这个是serialport的接收事件的话
他是会自动触发的,要看你的串口对象设置的多少字节触发该事件
你这样读也可以说没有问题,不过串口数据的处理一般是缓存,分析
第二个问题
调用comm_DataReceived(this,EventArgs.empty)

解决方案 »

  1.   

    seralport就有DataReceived事件啊,你可以动态绑定,也可以在设计期就制定好
      

  2.   

    我说的就是SerialPort的DataReceive事件!!!!!!我就是不知道怎么能够去断定串口对象要达到多少字节才能触发该事件,应为每次来的数据字节数都是不一样的,要定义的话在哪里定义???我觉得还是要靠上述的Modbus协议的某位数据来判断串口的接收字节数;可是该怎么写???另外
    我根据mervyn807的回复,用comm_DataReceived(this,EventArgs.Empty)调用该接收函数,爆出错误“无法从System.EventArgs转换为System.IO.Ports.SerialDataReceivedEventArgs)
    这是为什么啊?
      

  3.   

    那你把参数类型改为SerialDataReceivedEventArgs不就完了吗
    或者直接comm_DataReceived(null,null)试试
    serialport 有个属性ReceivedBytesThreshold = 1;就是串口有1个字节
    就触发接收事件进行数据读取,可以根据你的需要设置
      

  4.   

    我试了comm_DataReceived(null,null)
    发现如下:
    我在原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数组就自动清空了,数据全没了!!这是为何??
      

  5.   

    嘎嘎,串口收数据收不全要等待下再接收,可以用Thread.sleep
      

  6.   

            private void SerialPort_DataReceived( object sender , SerialDataReceivedEventArgs e )
            {            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;
                        }            }
      

  7.   

            private void SerialPort_DataReceived( object sender , SerialDataReceivedEventArgs e )
            {            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]
    然后再去判断是否接受完了!再去校验什么的!