解决方案 »

  1.   

    用List<byte>或byte[]+int自己算索引偏移
    不保证2次就能收到所有的数据,也有可能需要很多次,这跟你发送的数据量有关系
    如果很短,也有可能一次就收到你可以自定义起始符和结束符,这样就能知道到哪里就算收全了
    或者如果每次发送的是固定长度的,判断长度也可以如果是同步接收,也可以通过时间来判断,比如100ms都没有任何新的字节到达
      

  2.   

    就是起止符,一般如果你发送的是ASCII码,那么数据中就绝对不会出现类似0x02,0x0D这种东西
    一般都是将0x02作为起始符,0x0D作为结束符怎么拼接,你的字符串总要变成byte数组才能通过串口发送吧
    不要直接发送,而是循环赋值到一个新的byte数组中去,然后再发送
    或者发送之前,先发个02,发送结束,再发送个0D,都行
      

  3.   

    如果你要发送的内容中包含汉字,那么编码02和0d有可能被正常的数据使用
    你就需要自己定义起止符了
    比如ffff作为起始,0000作为结束
      

  4.   

    话说,串口发送文字消息,自己玩玩还可以,真正工业上,没有这么用的
    都是有固定的协议,
    比如固定长度,或者先发送后面总共的字节数,再发送数据
    或者即使是固定长度,也有起止符
    可能还要加上CRC校验或SUM校验来抗干扰,避免接收到错误的数据
      

  5.   

    发送以后加延时,延时药足够大
     PDUscan.Sp.DiscardInBuffer();
                    PDUscan.Sp.DiscardOutBuffer();
                    byte[] bytes = setaddr(addnow, addnew);
                    PDUscan.Sp.Write(bytes, 0, bytes.Length);
                    System.Threading.Thread.Sleep(100);
                    int len = PDUscan.Sp.BytesToRead;
                    if (len != 8)
                    {
                        return false;
                    }
                    else
                    {
                        byte[] recievebyte = new byte[len];
                        PDUscan.Sp.Read(recievebyte, 0, len);
                        if (recievebyte[4] == 0x01)
                        {
                            PDUscan.Sp.Close();
                            return true;
                        }
                        else
                        {
                            PDUscan.Sp.Close();
                            return false;
                        }
                    }
      

  6.   


    我的程序加延时后也没什么问题,去掉延时就不行了,请问这里为什么要加延??而且请问你的代码中recievebyte[4] == 0x01 是什么意思??
      

  7.   

    串口通信是要有时间的,比如,我的接收信息是36个字节,我测试过,9600的波特率可能需要35ms左右,基本上延时个100ms就可以保证接收数据完整,计算机的反应速度是很快的,执行一个语句的速度可能非常快,来不及接收完整就会跳到下一句了
      

  8.   


    我这个代码是对法只在接收准确的信息后才会返回信息,我看楼主的情况可能和我的差不多我不确定事件的触发是接收到一个字节的同时就触发呢,还是其他的方法,ReceivedBytesThreshold这个属性我都没改过,按理来说是接收到一个字节的同时就触发事件。那它触发事件后,在执行事件的时候会不会有新的触发,如果有,而且当前事件还没执行完,那还触发吗?
      

  9.   


    我这个代码是对法只在接收准确的信息后才会返回信息,我看楼主的情况可能和我的差不多我不确定事件的触发是接收到一个字节的同时就触发呢,还是其他的方法,ReceivedBytesThreshold这个属性我都没改过,按理来说是接收到一个字节的同时就触发事件。那它触发事件后,在执行事件的时候会不会有新的触发,如果有,而且当前事件还没执行完,那还触发吗?没有过,可能需要清空接收区,在接到设置的字节数才会触发
      

  10.   

    放到数组里呗
    比如List<byte>,或byte[]都行
      

  11.   

    放到数组里呗
    比如List<byte>,或byte[]都行
    用ArragList  LIST=new ArragList();为什么不行啊,因为我判断的是if(LIST[2]==0x69)调试提示object 和int不能。