解决方案 »

  1.   

    老问题,mySerialPort.Read函数是指读取数据,返回值才是读取了多少数据,最后要你自己粘包的,例如你要读取1024个字节
    int nReadLen=1024;
    int nLeftLen=nReadLen;
    byte[] buffer=new byte[nReadLen];
    while(nLeftLen>0)
    {
    nLeftLen-=mySerialPort.Read(buffer,nReadLen-nLeftLen,nLeftLen);
    }
      

  2.   

    receivedata()
    {
            if(mySerialPort.IsOpen == false)
                    mySerialPort.Open();
                    Thread.Sleep(1000);
                  byte[] ReDatas= new byte[mySerialPort.BytesToRead];
                    mySerialPort.Read(ReDatas, 0, ReDatas.Length);
            ...//数据处理
            Thread.Sleep(1000);
            mySerialPort.Close();
    }
      

  3.   

    假设,你的串口名字叫:serialPortData,调用DataReceived 事件,在事件里边写你的那个读取的逻辑就可以了,如下:
    serialPortData.DataReceived += new SerialDataReceivedEventHandler(serialPortData_DataReceived);        void serialPortData_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                    byte[] readHex = new byte[serialPortData.BytesToRead];
                    serialPortData.Read(readHex, 0, readHex.Length);
            }
      

  4.   

    问题不是每两秒才能接收一次数据,事实上只要打开了串口,就可以接收数据
    在你打开串口的时候,发送方并没有向串口发送数据,所以BytesToRead为0只是为什么要频繁的打开关闭串口呢?
      

  5.   

    还有个问题,在Thread.Sleep(1000);的过程中,可能会有数据进入串口缓冲区,而你将串口关闭后,缓冲区的数据被清空,下次打开串口再读取,这些数据是已经丢失了的。
      

  6.   

    是的,你说的我也想到了。可如果只是一个页面跑这个程序,打开串口后一直读,不去关闭它,是没问题的,假如你还有其余页面窗口来调用这个程序,也要操作相同的串口去读数据,如果之前窗口上的串口不关闭,那么新的窗口上对串口的操作是不成功的,即要把之前的关闭了再去打开才能读。有没有什么好的方法或者建议,不甚感激。是指不同的程序要调用同一个串口?这个不大好办,因为串口是非共享资源,只能确保使用完毕了再关闭串口。据你描述,似乎串口什么时候开始有数据传送过来并不知道,关闭串口的时候可能丢失数据。要不干脆就使用多个串口如果是同一个程序需要在不同的地方调用串口,就可以将数据解析做在一起,没必要频繁的打开关闭
    谢谢你的回答!是同一个程序要执行多次。我现在是将程序写成控件供JS页面调用,多个JS页面操作时都需要用到同一个串口。如果不把之前打开的关闭,第二个页面调用时就无法打开。那之前我一开始问的那个问题怎么解决?大神有QQ吗?想向你请教!
      

  7.   

    JS页面我就不懂了,如果你想频繁的打开关闭串口,得知道数据在何时过来,确保不会在串口关闭期间丢失数据。
    Thread.Sleep(1000);
    mySerialPort.Close();可以不Sleep而直接关闭串口的
      

  8.   

    我用的sp.readexisting,之后sleep,再read一次
      

  9.   

    因为我们这需要多个JS页面去读串口,比如第一个JS页面打开了串口,那么就需要读完数据后关闭它,再打开,这样,第二个JS页面就可以在第一个关闭串口那段时间把串口打开读数据,如果不关闭,那么只有第一个JS页面才能一直读,另外的JS页面读不了,因为串口一直处于被占用状态