int length = SpCom.BytesToRead;
上面这句应该是获取接收缓冲区中数据的字节数的大小的,
我在接收到数据后明明SpCom.BytesToRead里面的数是85或者是其他大于14的某个数(打断点后鼠标停留在BytesToRead上),但执行这一句后只要SpCom.BytesToRead里的数大于14,length 里最大只能为14,这是为什么?            uint i = 0;
            string text = "";
            int length = SpCom.BytesToRead;
            byte[] RevData = new byte[length];此句打断点后鼠标停留在BytesToRead上,length 里最大只能为14

解决方案 »

  1.   

    Com口接收的数据不一定能等于发送的数据,很多情况下需要读多次才能读完整,估计你是看错了,SpCom.BytesToRead应该等于length
      

  2.   

    以下是全部代码:
    //******************************************************************
            //SpCom_DataReceived
            //功能:接收MCU传来的数据,并在接收文本框中显示
            //******************************************************************
            private void SpCom_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                string text = "";
                int length = SpCom.BytesToRead;
        byte[ ] RevData = new byte[ length ];
                SpCom.Read(RevData, 0, length);//读串口接收缓冲区中的数据到RevData中
    if ( hex接收 . Checked )
    {
    text = byteToHexStr ( RevData );
    }
    else 
    {
    text = System.Text.Encoding.Default.GetString ( RevData );
      }
    UpdateReceiveTextBox(text);//在接收文本框中显示
            }
            //******************************************************************        //******************************************************************
            //UpdateReceiveTextBox
            //功能:若串行接收和textBoxRev控件不是在同一线程中创建,那么通过Invoke
            //     跨线程用串口接收到的数据来更新接收文本框中的数据
            //参数:text-要显示的接收数据
            //返回:无
            //******************************************************************
            private void UpdateReceiveTextBox(string text)
            {
                //不在同一线程
                if (textBoxRev.InvokeRequired)
                {
                 HandleInterfaceUpdateDelegate InterfaceUpdate=newHandleInterfaceUpdateDelegate(UpdateReceiveTextBox);
                 Invoke(InterfaceUpdate, new object[] { text });
                }
                //在同一线程
                else
                {
                    textBoxRev.Text += text;
                }
            }
    public static string byteToHexStr(byte[] bytes)
            {
                string returnStr = "";
                if (bytes != null)
                {
                    for (int i = 0; i < bytes.Length; i++)
                    {
                        returnStr += bytes[i].ToString("X2");
                    }
                }
                return returnStr;
            }  
      

  3.   

    read方法不等于全部读完,可能只读一部分,改为如下代码即可string text = "";
                int length = SpCom.BytesToRead;
                byte[] RevData = new byte[length];
                int nHasRead = 0;
                while(nHasRead != length)
                {
                    nHasRead += SpCom.Read(RevData, nHasRead, length - nHasRead);//读串口接收缓冲区中的数据到RevData中
                }
      

  4.   

    首先感谢大家的回复,问题已经找到,虽然大家的回复没有采用。5楼的方法不行,length没有更新,但是跟我的解决方法类似,