int bytes = serialPort1.BytesToRead; 我在后面定义一个数组: byte[] buffer = new byte[bytes];当串口缓存里有16个数据时,bytes却只有3,有时是13,有时8,反正经常只读了一部分数据,导致该数组里的数据总是一经判断就出错。为什么呀?为何bytes和serialPort1.BytesToRead不相等,怎么解决这个问题,希望大家帮帮我! 

解决方案 »

  1.   

    先确定你的返回数据是多少字节,在接收之前定义一个字节数组,注意这个字节数组的长度一定要比接收的数据长。
    例如:
                    if (!serialPort1.IsOpen)
                    {
                        serialPort1.Open();
                    }
    byte[] temp1 = mysendb("FF FF 00 00 FF FF"); //复位指令
    serialPort1.Write(temp1, 0, 6);//发送复位数据
                     Thread.Sleep(1000);
                     byte[] recb = new byte[6];//接收复位返回值
                     int iffuwei = serialPort1.Read(recb, 0, 6);
      

  2.   

    把代碼放線程或者計時器 里去循環接收
     if (AVR.BytesToRead > 0)
     {
         byte[] tmpbuf = new byte[AVR.BytesToRead];
         AVR.Read(tmpbuf, 0, AVR.BytesToRead);
         ls_RevceDate = BitConverter.ToString(tmpbuf).Trim();
                       
      }
      

  3.   

    循环read的话,会读多了,因为我接收的数据的一组一组地过来的,循环地读会读到下一组的数据。
      

  4.   

    for (;;)
                {
                    serialPort1.Read(buffer, 0, bytes);
                    if (buffer[bytes - 2] == 255 & buffer[bytes - 1] == 255)
                        break;
                }这个循环读取 有问题吗
      

  5.   


    public partial class Form1 : Form
        {
            delegate void del();
            public Form1()
            {
                InitializeComponent();
            }        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                this.Invoke(new del(A));
            }
            private void A()
            {
                if (serialPort1.BytesToRead == 9)
                {
                    byte[] buffer = new byte[serialPort1.BytesToRead];
                    serialPort1.Read(buffer, 0, serialPort1.BytesToRead);
                   string str=Encoding.ASCII.GetString(buffer);
                    richTextBox1.AppendText(str);
                }
            }        private void Form1_Load(object sender, EventArgs e)
            {
                serialPort1.Open();
            }        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (serialPort1.IsOpen)
                {
                    serialPort1.Close();
                }
            }
        }不知你具体的需求是什么,反正我能顺利将数据按9个字节读进来为。
      

  6.   

    我每组数据的最后两个是255,大家帮我看看程序问题在哪儿?             int bytes = serialPort1.BytesToRead;
                byte[] buffer = new byte[bytes];
                
                for (;;)
                {                serialPort1.Read(buffer, 0, bytes);
                    if (buffer[bytes - 2] == 255 & buffer[bytes - 1] == 255)
                        break;
                }因为出现了只读取了一部分数据的情况,我加了for语句是想反复读数据,判断所读取的数据最后两个是255的时候,就认为已经完整读取了一组数据,跳出循环,往下执行。
    感觉程序有问题,希望大家指点一下。 
      

  7.   

    首先你要明白Read方法会导致BytesToRead重新计算,所以你的程序必定是有问题,其次if (buffer[bytes - 2] == 255 & buffer[bytes - 1] == 255)
    里的&应该改为&&.
    假如你的每组数据长度不固定,只是以255 作为结束标志,我觉得要另建一数组,每次读取一字节进去,遇到255时表示读完,取出这数组的值,然后清空,重新再填。
      

  8.   

    试试这样子List<byte> arr = new List<byte>();
                while (true)
                {
                    if (serialPort1.BytesToRead > 0)
                    {
                        arr.Add((byte)serialPort1.ReadByte());
                        if (arr.Count > 2)
                        {
                            int len = arr.Count;
                            if (arr[len - 1] == 255 && arr[len - 2] == 255)
                            {
                                break;
                            }
                        }
                    }
                }
                /*
                 * 处理arr            */
                arr.Clear();
      

  9.   

      System.Threading.Thread.Sleep(500);//发送完信息立即接收一定要加上延时函数
    不然肯定会接收不完整了
      

  10.   

    就在   serialPort1_DataReceived_1()里啊
      

  11.   

    那么就不要循环了,把21楼的循环去掉,
    List<byte> arr = new List<byte>();放在外事件处理函数外面
      

  12.   


    我把数据读到list中后,再把list中的数据放到数组buffer里,把list清空,后面显示buffer里的数据
    发到400多组的时候,又开始整组丢数据了。代码如下: List<byte> arr = new List<byte>();
                while (true)
                {
                    if (serialPort1.BytesToRead > 0)
                    {
                        System.Threading.Thread.Sleep(10);
                        arr.Add((byte)serialPort1.ReadByte());
                        if (arr.Count > 2)
                        {
                            int len = arr.Count;
                            if (arr[len - 1] == 255 && arr[len - 2] == 255)
                            {
                                break;
                            }
                        }
                    }
                }
                int bytes = arr.Count;
                byte[] buffer = new byte[bytes];            for (int i = 0; i < bytes; i++)
                {
                    buffer[i] = arr[i];            }
                arr.Clear();
      

  13.   

      serialPort1.ReadBufferSize 串口缓冲大小设了没
      

  14.   

    不知道你的什么问题,我以前读取的PLC的串口数据包。
    我觉得你直接判断报文结束字符不就行了