WinForm 串口接收数据不完整

目的是为了获得ADAM4017(模拟量)上的传感器数据
下图是在串口调试工具上的结果 发送指定的指令,接收一整串完整的值

img

下图是在winform实现的效果,接收的数据长度不对,而且断断续续的。通过打断点发现创建完接收字节数组后,
并没有读到目标长度的数据。

img

下面是程序代码

namespace SerialPortManager
{
    public partial class Form1 : Form
    {
        SerialPort sp = new SerialPort();
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            sp.PortName = "com6"; //设置串口号
            sp.BaudRate = 9600;//设置波特率
            wd_txt.Text = null;
            Control.CheckForIllegalCrossThreadCalls = false;    //这个类中我们不检查跨线程的调用是否合法(因为.net 2.0以后加强了安全机制,,不允许在winform中直接跨线程访问控件的属性)
            sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
            sp.Open();
        }



        private void btnSend_Click(object sender, EventArgs e)
        {
            if (!sp.IsOpen) //如果没打开
            {
                MessageBox.Show("请先打开串口!", "Error");
                return;
            }

            //处理数字转换
            string[] strArray = txtSend.Text.Trim().Split(' '); //将02 03 00 00 00 08 44 3F分割成8个分别存放
            byte[] byteBuffer = new byte[strArray.Length];  //创建一个新的byte

            for (int i = 0; i < strArray.Length; i++)        //对获取的字符做相加运算
            {
                Byte[] bytesOfStr = Encoding.Default.GetBytes(strArray[i]);
                int decNum = Convert.ToInt32(strArray[i], 16); //atrArray[i] == 12时,temp == 18
                byteBuffer[i] = Convert.ToByte(decNum);
            }
            sp.Write(byteBuffer, 0, byteBuffer.Length);
        }

        void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (sp.IsOpen)     //此处可能没有必要判断是否打开串口,但为了严谨性,我还是加上了
            {
                byte[] byteRead = new byte[sp.BytesToRead];    //BytesToRead:sp1接收的字符个数
                {
                    Byte[] receivedData = new Byte[sp.BytesToRead];        //创建接收字节数组
                    sp.Read(receivedData, 0, receivedData.Length);         //读取数据
                    sp.DiscardInBuffer();                                  //清空SerialPort控件的Buffer
                    string strRcv = null;
                    string a = null;
                    for (int i = 0; i < receivedData.Length; i++) //窗体显示
                    {
                        strRcv = strRcv + receivedData[i].ToString("X2");  //16进制显示
                        if (i == 1) 
                        {
                            a = a + receivedData[i].ToString("X2");
                        }
                    }
                    wd_txt.Text = a;
                    txtReceive.Text += strRcv + "\r\n";
                }
            }
            else
            {
                MessageBox.Show("请先打开串口");
            }
        }