串口接收多个从机的数据时发生闪退,断点调试到委托时间出现错误,请问是那个位置出的问题呢

下面是主窗口代码,主要功能是将回收的数据计算然后导出曲线图和图表excel,接收单个从机时无闪退问题,但是连接两个从机后闪退,断点错误的截图提示如下,

img


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OfficeOpenXml;
using OfficeOpenXml.Drawing.Chart;
using OfficeOpenXml.Style;
using System.Data;
using System.Drawing;
using System.IO;
using System.Data.SqlClient;
using 项目1.MySql;

namespace 项目1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //为6个曲线图创建初始值
        #region
        List<double> list1 = new List<double>(0);
        double g_datanext1;
        List<double> list2 = new List<double>(0);
        double g_datanext2;
        List<double> list3 = new List<double>(0);
        double g_datanext3;
        List<double> list4 = new List<double>(0);
        double g_datanext4;
        List<double> list5 = new List<double>(0);
        double g_datanext5;
        List<double> list6 = new List<double>(0);
        double g_datanext6;
        #endregion


         private MyDbContext MyDb=new MyDbContext();



        bool isOpen = false;     //打开串口标志位
        bool isSetProperty = false;//属性设置标志位
        int spProcessStep = 0;
        Crc_Check crcCheck = new Crc_Check();//CrC检测
        SerialPort sp = new SerialPort();


        private void Form1_Load(object sender, EventArgs e)//总设置   初始化
        #region
        {
            cBoxCOMPORTSet();
            CBoxBaudRateSet();
            cBoxDataBitsSet();
            cBoxStopBitsSet();
            cBoxparityBitsSet();
            measuring();
            InitMySql();
        }
        #endregion

        private void InitMySql()//新建navicat mysql
        #region
        {
            try
            {
                MyDb.Database.EnsureCreated();//尝试初始化数据库,如果存在则不会新建数据库和表

            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);//截取异常原因
            }
        }
        #endregion

        void Disp_charts()//曲线图绘制方法
        #region
        {
            chart1.Series[0].Points.DataBindY(list1);
            chart2.Series[0].Points.DataBindY(list2);
            chart3.Series[0].Points.DataBindY(list3);
            chart4.Series[0].Points.DataBindY(list4);
            chart5.Series[0].Points.DataBindY(list5);
            chart6.Series[0].Points.DataBindY(list6);
        }
        #endregion

        private void measuring()//量程设置初始化
        #region
        {
            Voltage.Text = "400";
            electric.Text = "5";
            accuracy.Items.Add("0 1/10000度");
            accuracy.SelectedIndex = 0;
            Mutualism1.Items.Add("1");
            Mutualism1.Items.Add("2");
            Mutualism2.Items.Add("1");
            Mutualism2.Items.Add("2");
            Mutualism1.SelectedIndex = 0;
            Mutualism2.SelectedIndex = 0;
        }
        #endregion

        private void cBoxparityBitsSet()//校验位初始
        #region
        {
            cBoxparityBits.Items.Add("无");
            cBoxparityBits.Items.Add("奇校验");
            cBoxparityBits.Items.Add("偶校验");
            cBoxparityBits.SelectedIndex = 0;//默认设置为无校验
        }
        #endregion

        private void cBoxStopBitsSet()//停止位初始
        #region
        {
            cBoxStopBits.Items.Add("0");
            cBoxStopBits.Items.Add("1");
            cBoxStopBits.Items.Add("1.5");
            cBoxStopBits.Items.Add("2");
            cBoxStopBits.SelectedIndex = 1;
        }
        #endregion
        private void cBoxDataBitsSet()//数据位初始
        #region
        {
            cBoxDataBits.Items.Add("8");
            cBoxDataBits.Items.Add("7");
            cBoxDataBits.Items.Add("5");
            cBoxDataBits.SelectedIndex = 0;

            int[] datas = new int[] { 5, 6, 7, 8 };//数据位
            cBoxDataBits.DataSource = datas;
            cBoxDataBits.SelectedIndex = 3;
        }
        #endregion

        private void CBoxBaudRateSet()//波特率初始
        #region
        {
            {
                CBoxBaudRate.Items.Add("1200");
                CBoxBaudRate.Items.Add("2400");
                CBoxBaudRate.Items.Add("4800");
                CBoxBaudRate.Items.Add("9600");
                CBoxBaudRate.Items.Add("19200");
                CBoxBaudRate.Items.Add("38400");
                CBoxBaudRate.Items.Add("57600");
                CBoxBaudRate.Items.Add("115200");
                CBoxBaudRate.SelectedIndex = 3;
            }
        }
        #endregion
        private void cBoxCOMPORTSet()//com口初始
        #region
        {
            for (int i = 0; i < 10; i++)    //预示10个com口
            {

                cBoxCOMPORT.Items.Add("COM" + (i + 1).ToString());//增加combox中items;

            }

            cBoxCOMPORT.SelectedIndex = 1;//默认设置为com1口

        }
        #endregion

        private bool CheckProtSetting()//检测串口配置是否为空
        #region
        {
            if (CBoxBaudRate.Text.Trim() == "") return false;
            if (cBoxCOMPORT.Text.Trim() == "") return false;
            if (cBoxDataBits.Text.Trim() == "") return false;
            //if (cBoxparityBits.Text.Trim() == "") return false;
            if (cBoxStopBits.Text.Trim() == "") return false;
            return true;
        }
        #endregion

        private void SetPortProperty()//发送以下信息给串口
        #region
        {


            sp.PortName = cBoxCOMPORT.Text.Trim();//串口的名字,combox中的文本内容
            sp.BaudRate = Convert.ToInt32(CBoxBaudRate.Text.Trim());//波特率为cbxbaudrate内的内容

            float f = Convert.ToSingle(cBoxStopBits.Text.Trim());//声明一个float类型的变量f;值为cbxstopbits中的内容

            if (f == 0)
            {
                sp.StopBits = StopBits.None;

            }
            else if (f == 1.5)
            {
                sp.StopBits = StopBits.OnePointFive;

            }
            else if (f == 1)
            {
                sp.StopBits = StopBits.One;

            }
            else if (f == 2)
            {
                sp.StopBits = StopBits.Two;

            }
            else
            {
                sp.StopBits = StopBits.One;
            }


            sp.DataBits = Convert.ToInt16(cBoxDataBits.Text.Trim());//通信

            string s = cBoxparityBits.Text.Trim();//声明一个string类型的 s储存 cbxparity中的内容
            if (s.CompareTo("无") == 0)
            {
                sp.Parity = Parity.None;
            }
            else if (s.CompareTo("奇校验") == 0)
            {
                sp.Parity = Parity.Odd;
            }
            else if (s.CompareTo("偶校验") == 0)
            {
                sp.Parity = Parity.Even;
            }
            else
            {
                sp.Parity = Parity.None;
            }


            sp.ReadTimeout = -1;//

            sp.RtsEnable = true;//

            sp.DataReceived += new SerialDataReceivedEventHandler(SpDataReceived);//
        }
        #endregion


        private void OpenCom()//打开串口设置
        #region
        {

            if (isOpen == false)//
            {
                lblStatusCom.Text = "ON";
                progressBar1.Value = 100;
                if (!CheckProtSetting())//
                {
                    MessageBox.Show("串口未设置!", "错误提示");//
                    return;


                }
                if (!isSetProperty)//
                {
                    SetPortProperty();//
                    isSetProperty = true;//

                }
                try//
                {
                    sp.Open();//
                    isOpen = true;//
                    btnOpen.Text = "关闭串口";//
                    cBoxparityBits.Enabled = false;//
                    cBoxDataBits.Enabled = false;//
                    cBoxCOMPORT.Enabled = false;//
                    cBoxStopBits.Enabled = false;//
                    CBoxBaudRate.Enabled = false;//
                                                 // progressBar1.Value = 100;


                }
                catch (Exception)//
                {
                    isSetProperty = false;//
                    isOpen = false;//
                    MessageBox.Show("串口无效或被占用!", "错误提示");//
                    progressBar1.Value = 0;
                    lblStatusCom.Text = "OFF";

                }
            }
            else
            {
                progressBar1.Value = 0;
                lblStatusCom.Text = "OFF";


                try//
                {
                    sp.Close();//
                    isOpen = false;//
                    isSetProperty = false;//
                    btnOpen.Text = "打开串口";//
                    CBoxBaudRate.Enabled = true;//
                    cBoxCOMPORT.Enabled = true;//
                    cBoxDataBits.Enabled = true;//
                    cBoxparityBits.Enabled = true;//
                    cBoxStopBits.Enabled = true;//



                }
                catch (Exception)//
                {

                    //label6.Text = "关闭串口时发生错误";//

                }

            }


        }
        #endregion

        private void btnOpen_Click(object sender, EventArgs e)//调用opencom方法
        #region
        {
            OpenCom();
        }
        #endregion
        void SpDataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)//委托
        #region
        {
            //System.Threading.Thread.Sleep(30);//线程挂起100ms(等待100ms)


            //委托
            this.Invoke((EventHandler)(delegate
            {

                Byte[] ReceivedData = new Byte[sp.BytesToRead];//  申明一个byte类数组,用于储存接收的数据(sp.BytesToRead读取串口接收区总长度)
                sp.Read(ReceivedData, 0, ReceivedData.Length);//


                RecvDate1(ReceivedData);

                sp.DiscardOutBuffer();//
                sp.DiscardInBuffer();//

                if (tBoxDataIN.Text.Length > 1000)
                {
                    tBoxDataIN.Text = "";
                }
                

            }));

        }
        #endregion
        private void RecvDate1(byte[] bte)//回收数据流
        #region
        {

            if (bte.Length > 4)
            {
                if (bte[1].ToString("X2") == "02")
                {
                    byte Byt = bte[4];//转换为10进制

                    string strbit = bitTostring(Convert.ToString(Byt, 2));//将10进制转换为二进制

                    
                }
                else if (bte[1].ToString("X2") == "01")
                {

                    byte Byt = bte[4];//转换为10进制

                    string strbit = bitTostring(Convert.ToString(Byt, 2));


                    

                }

            }
            string displayDate = null;
            for (int i = 0; i < bte.Length; i++)//
            {

                displayDate += bte[i].ToString("X2");

            }

            if (displayDate.Length > 9)
            {
                tBoxDataIN.Text = tBoxDataIN.Text + "接收:" + displayDate + "\r\n";//临时显示数据传输状态
            }
            else
                return;

            if (textBox2.Text == "04")
            {
                Chulishuju(displayDate);
            }
            else
            {
                MessageBox.Show("功能码错误");
            }           
        }
        #endregion

        private string bitTostring(string str)//调节数据长度为两个字节
        #region
        {
            {
                string Str;
                if (str.Length == 0)
                {
                    Str = "0000";
                }
                else if (str.Length == 1)
                {
                    Str = "000" + str;
                }
                else if (str.Length == 2)
                {
                    Str = "00" + str;
                }
                else if (str.Length == 3)
                {
                    Str = "0" + str;
                }
                else
                {
                    Str = str;
                }

                return Str;

            }
        }
        #endregion

        private void Chulishuju(string displayDate)//04功能码,切割接收框数据  从第六位开始 每4位生成一个新的数据
        #region
        {
            
                int z = 4;
                //电流
                string AI = displayDate.Substring(6, z);
                string BI = displayDate.Substring(10, z);
                string CI = displayDate.Substring(14, z);

                //电压
                string AU = displayDate.Substring(18, z);
                string BU = displayDate.Substring(22, z);
                string CU = displayDate.Substring(26, z);

                Fangfa(AI, BI, CI, AU, BU, CU);

            

        }
        #endregion


        
        private void Fangfa(string aI, string bI, string cI, string aU, string bU, string cU)//将接收框数据转换成int类型
        #region
        {
            int num1 = Int32.Parse(aI, System.Globalization.NumberStyles.HexNumber);
            int num2 = Int32.Parse(bI, System.Globalization.NumberStyles.HexNumber);
            int num3 = Int32.Parse(cI, System.Globalization.NumberStyles.HexNumber);
            int num4 = Int32.Parse(aU, System.Globalization.NumberStyles.HexNumber);
            int num5 = Int32.Parse(bU, System.Globalization.NumberStyles.HexNumber);
            int num6 = Int32.Parse(cU, System.Globalization.NumberStyles.HexNumber);

            //textBox9.Text = num7.ToString("f2");

            jisuan(num1, num2, num3, num4, num5, num6);
#endregion

        }

        
        private void jisuan(int num1, int num2, int num3, int num4, int num5, int num6)//将int类型转换成double类型  计算  可视化
        #region
        {
            double num7 = Convert.ToDouble(num1);
            double num8 = Convert.ToDouble(num2);
            double num9 = Convert.ToDouble(num3);
            double num10 = Convert.ToDouble(num4);
            double num11 = Convert.ToDouble(num5);
            double num12 = Convert.ToDouble(num6);
            if (Mutualism1.Text == "1")
            {
                if (Mutualism2.Text == "1")
                {
                    double IA = num7 / 65535 * 5 * 1;

                    txbAI.Text = IA.ToString("f5");
                    double IB = num8 / 65535 * 5 * 1;

                    txbBI.Text = IB.ToString("f5");
                    double IC = num9 / 65535 * 5 * 1;

                    txbCI.Text = IC.ToString("f5");
                    double UA = num10 / 65535 * 400 * 1;

                    txbAU.Text = UA.ToString("f2");
                    double UB = num11 / 65535 * 400 * 1;

                    txbBU.Text = UB.ToString("f2");
                    double UC = num11 / 65535 * 400 * 1;

                    txbCU.Text = UC.ToString("f2");
                    double XUA = num10 / 65535 * 800 * 1;

                    txbXAU.Text = XUA.ToString("f2");
                    double XUB = num11 / 65535 * 800 * 1;

                    txbXBU.Text = XUB.ToString("f2");
                    double XUC = num11 / 65535 * 800 * 1;

                    txbXCU.Text = XUC.ToString("f2");


                }
                else if (Mutualism2.Text == "2")
                {
                    double IA = num7 / 65535 * 5 * 1;
                    txbAI.Text = IA.ToString("f5");
                    double IB = num8 / 65535 * 5 * 1;
                    txbBI.Text = IB.ToString("f5");
                    double IC = num9 / 65535 * 5 * 1;
                    txbCI.Text = IC.ToString("f5");
                    double UA = num10 / 65535 * 400 * 2;
                    txbAU.Text = UA.ToString("f2");
                    double UB = num11 / 65535 * 400 * 2;
                    txbBU.Text = UB.ToString("f2");
                    double UC = num11 / 65535 * 400 * 2;
                    txbCU.Text = UC.ToString("f2");
                    double XUA = num10 / 65535 * 800 * 2;
                    txbXAU.Text = XUA.ToString("f2");
                    double XUB = num11 / 65535 * 800 * 2;
                    txbXBU.Text = XUB.ToString("f2");
                    double XUC = num11 / 65535 * 800 * 2;
                    txbXCU.Text = XUC.ToString("f2");
                }


            }
            else if (Mutualism1.Text == "2")
            {
                if (Mutualism2.Text == "1")
                {
                    double IA = num7 / 65535 * 5 * 2;
                    txbAI.Text = IA.ToString("f5");
                    double IB = num8 / 65535 * 5 * 2;
                    txbBI.Text = IB.ToString("f5");
                    double IC = num9 / 65535 * 5 * 2;
                    txbCI.Text = IC.ToString("f5");
                    double UA = num10 / 65535 * 400 * 1;
                    txbAU.Text = UA.ToString("f2");
                    double UB = num11 / 65535 * 400 * 1;
                    txbBU.Text = UB.ToString("f2");
                    double UC = num11 / 65535 * 400 * 1;
                    txbCU.Text = UC.ToString("f2");
                    double XUA = num10 / 65535 * 800 * 1;
                    txbXAU.Text = XUA.ToString("f2");
                    double XUB = num11 / 65535 * 800 * 1;
                    txbXBU.Text = XUB.ToString("f2");
                    double XUC = num11 / 65535 * 800 * 1;
                    txbXCU.Text = XUC.ToString("f2");
                }
                else if (Mutualism2.Text == "2")
                {
                    double IA = num7 / 65535 * 5 * 2;
                    txbAI.Text = IA.ToString("f5");
                    double IB = num8 / 65535 * 5 * 2;
                    txbBI.Text = IB.ToString("f5");
                    double IC = num9 / 65535 * 5 * 2;
                    txbCI.Text = IC.ToString("f5");
                    double UA = num10 / 65535 * 400 * 2;
                    txbAU.Text = UA.ToString("f2");
                    double UB = num11 / 65535 * 400 * 2;
                    txbBU.Text = UB.ToString("f2");
                    double UC = num11 / 65535 * 400 * 2;
                    txbCU.Text = UC.ToString("f2");
                    double XUA = num10 / 65535 * 800 * 2;
                    txbXAU.Text = XUA.ToString("f2");
                    double XUB = num11 / 65535 * 800 * 2;
                    txbXBU.Text = XUB.ToString("f2");
                    double XUC = num11 / 65535 * 800 * 2;
                    txbXCU.Text = XUC.ToString("f2");
                }


            }
            


            //写入DataGridView
            
            DataGridView table = dataGridView1;//设置datagridview的列名
            int cel = 0;
            int index = table.Rows.Add();
            table.Rows[index].Cells[cel++].Value = DateTime.Now.ToString();//时间
            table.Rows[index].Cells[cel++].Value = txbAI.Text;
            table.Rows[index].Cells[cel++].Value = txbBI.Text;
            table.Rows[index].Cells[cel++].Value = txbCI.Text;
            table.Rows[index].Cells[cel++].Value = txbAU.Text;
            table.Rows[index].Cells[cel++].Value = txbBU.Text;
            table.Rows[index].Cells[cel++].Value = txbCU.Text;
            



            //写入navicat for mysql
            
            data1 data = new data1();
            data.A相电流 = txbAI.Text;
            data.B相电流 = txbBI.Text;
            data.C相电流 = txbCI.Text;
            data.A相电压 = txbAU.Text;
            data.B相电压 = txbBU.Text;
            data.C相电压 = txbCU.Text;

            MyDb.tb_data1.Add(data);
            if (MyDb.SaveChanges() > 0)
            {

            }
            else
            {
                MessageBox.Show("导入失败");
            }
            #endregion
        }

        //未使用
        #region
        private void SendDateTo7(string str)//未使用
        {
            Random random = new Random();
            int rand = random.Next(0, 300);
            string temp = Convert.ToString(rand);
            string c;
            string[] crc = new string[2];
            if (temp.Length < 2)
            {
                c = "000" + temp;
            }
            else if (temp.Length < 3)
            {
                c = "00" + temp;
            }
            else if (temp.Length < 4)
            {
                c = "0" + temp;
            }
            else
            {
                c = temp;
            }
            str += c;
            string sum = null;
            sum = str.Substring(0, 2) + " " + str.Substring(2, 2) + " " + str.Substring(4, 2) + " " + str.Substring(6, 2) + " " + str.Substring(0, 2);
            crc[0] = crcCheck.GetHexStr(crcCheck.Check_CRC(crcCheck.GetStrHex(sum)), crcCheck.Check_CRC(crcCheck.GetStrHex(sum)).Length).Substring(3, 2); //将crc校验低位赋值给strsend
            crc[1] = crcCheck.GetHexStr(crcCheck.Check_CRC(crcCheck.GetStrHex(sum)), crcCheck.Check_CRC(crcCheck.GetStrHex(sum)).Length).Substring(0, 2);//将crc校验高位赋值给strsend
            str += crc[0];
            str += crc[1];
            byte[] HexSendData = new byte[7];
            for (int i = 0; i < (str.Length + 1) / 2; i++)
            {

                HexSendData[i] = Convert.ToByte(str.Substring(i * 2, 2), 16);//  将16进制表示的str,转换为byte类型的十进制数据发送即可
                //MessageBox .Show (HexSendData[i].ToString ());
            }
            if (sp.IsOpen != true)
            {
                SetPortProperty();
            }

            else
            {

                try
                {
                    sp.Write(HexSendData, 0, HexSendData.Length);
                    System.Threading.Thread.Sleep(100);
                    tBoxDataIN.Text = tBoxDataIN.Text + "发送:" + str + "\r\n";//临时显示数据传输状态 


                }
                catch (Exception)
                {
                    MessageBox.Show("发送数据时发生错误!", "错误提示");
                    return;
                }
            }



        }
        #endregion

        private void COMchexk_Click(object sender, EventArgs e)//检测串口
#region
        {
            bool comExistence = false;

            cBoxCOMPORT.Items.Clear();          //串口清零,将默认的串口位置清除

            for (int i = 0; i < 10; i++)// 分别检测0-9个串口是否可用
            {
                try//??????怎么用
                {
                    SerialPort sp = new SerialPort("COM" + (i + 1).ToString());
                    sp.Open();
                    sp.Close();
                    cBoxCOMPORT.Items.Add("COM" + (i + 1).ToString());
                    comExistence = true;

                }
                catch (Exception)//??????怎么用
                {
                    continue;

                }

            }
        }
        #endregion

        private void button1_Click(object sender, EventArgs e)//单步采集
        {
            listTostring();
        }

        private void listTostring()//单步采集  回收数据至文本框
        #region
        {
            string str = "";

            if (listView1.Items.Count != 0)//判断是否有内容
            {

                if (listView1.Items.Count > spProcessStep)
                {
                    listView1.Items[spProcessStep].Selected = true;

                    listView1.Items[0].BackColor = Color.White;
                    listView1.Items[spProcessStep].BackColor = Color.SkyBlue;

                    for (int i = 1; i < 9; i++)
                    {
                        str = str + listView1.Items[spProcessStep].SubItems[i].Text;

                    }

                    // MessageBox .Show (str);
                    if (spProcessStep > 1) listView1.Items[spProcessStep - 1].BackColor = Color.White;

                }
                else
                {

                    listView1.Items[listView1.Items.Count - 1].BackColor = Color.White;
                    spProcessStep = 0;


                    listView1.Items[spProcessStep].Selected = true;
                    listView1.Items[spProcessStep].BackColor = Color.SkyBlue;

                    for (int i = 1; i < 9; i++)
                    {
                        str = str + listView1.Items[spProcessStep].SubItems[i].Text;

                    }

                }

                SendDateTo8(str);

                spProcessStep++;



            }

            System.Threading.Thread.Sleep(50);//线程挂起100ms(等待100ms)
            readIOIN();
        }
        #endregion

        private void SendDateTo8(string str)//发送数据的方法
        #region
        {
            tBoxDataIN.Text = tBoxDataIN.Text + "发送:" + str + "\r\n";//临时显示数据传输状态  
            byte[] HexSendData = new byte[8];
            for (int i = 0; i < (str.Length + 1) / 2; i++)
            {

                HexSendData[i] = Convert.ToByte(str.Substring(i * 2, 2), 16);//  将16进制表示的str,转换为byte类型的十进制数据发送即可


                //MessageBox .Show (HexSendData[i].ToString ());
            }


            if (sp.IsOpen != true)
            {
                SetPortProperty();
            }

            else
            {

                try
                {

                    sp.Write(HexSendData, 0, HexSendData.Length);


                }
                catch (Exception)
                {
                    MessageBox.Show("发送数据时发生错误!", "错误提示");
                    return;
                }
            }
        }
        #endregion

        private void readIOIN()
        #region
        {
            string[] str = new string[8];
            string strSenddata = "";

            str[0] = "02";
            str[1] = "02";
            str[2] = "00";
            str[3] = "20";
            str[4] = "00";
            str[5] = "04";

            strSenddata = str[0] + " " + str[1] + " " + str[2] + " " + str[3] + " " + str[4] + " " + str[5];
            //str[6] = CRC_Check.GetHexStr(CRC_Check.Check_CRC(CRC_Check.GetStrHex(strSenddata)), CRC_Check.Check_CRC(CRC_Check.GetStrHex(strSenddata)).Length).Substring(3, 2); //将crc校验低位赋值给strsend
            //str[7] = CRC_Check.GetHexStr(CRC_Check.Check_CRC(CRC_Check.GetStrHex(strSenddata)), CRC_Check.Check_CRC(CRC_Check.GetStrHex(strSenddata)).Length).Substring(0, 2);//将crc校验高位赋值给strsend
            str[6] = crcCheck.GetHexStr(crcCheck.Check_CRC(crcCheck.GetStrHex(strSenddata)), crcCheck.Check_CRC(crcCheck.GetStrHex(strSenddata)).Length).Substring(3, 2); //将crc校验低位赋值给strsend
            str[7] = crcCheck.GetHexStr(crcCheck.Check_CRC(crcCheck.GetStrHex(strSenddata)), crcCheck.Check_CRC(crcCheck.GetStrHex(strSenddata)).Length).Substring(0, 2);//将crc校验高位赋值给strsend
            strSenddata = str[0] + str[1] + str[2] + str[3] + str[4] + str[5] + str[6] + str[7];

            SendDateTo8(strSenddata);
        }
        #endregion

        private void btnSendData_Click(object sender, EventArgs e) //发送数据到listview
        #region
        {
            {
                if (textBox1.Text == "")
                {
                    MessageBox.Show("发送信息为空");
                    return;
                }
                else
                {
                    string strSenddata = "";
                    strSenddata = textBox1.Text.ToString();
                    strSenddata = strSenddata + " " + textBox2.Text.ToString();
                    strSenddata = strSenddata + " " + textBox3.Text.ToString();
                    strSenddata = strSenddata + " " + textBox4.Text.ToString();
                    strSenddata = strSenddata + " " + textBox5.Text.ToString();
                    strSenddata = strSenddata + " " + textBox6.Text.ToString();


                    string[] str = new string[8];


                    textBox7.Text = crcCheck.GetHexStr(crcCheck.Check_CRC(crcCheck.GetStrHex(strSenddata)), crcCheck.Check_CRC(crcCheck.GetStrHex(strSenddata)).Length).Substring(3, 2); //将crc校验低位赋值给strsend
                    textBox8.Text = crcCheck.GetHexStr(crcCheck.Check_CRC(crcCheck.GetStrHex(strSenddata)), crcCheck.Check_CRC(crcCheck.GetStrHex(strSenddata)).Length).Substring(0, 2);//将crc校验高位赋值给strsend

                    str[0] = textBox1.Text;
                    str[1] = textBox2.Text;
                    str[2] = textBox3.Text;
                    str[3] = textBox4.Text;
                    str[4] = textBox5.Text;
                    str[5] = textBox6.Text;
                    str[6] = textBox7.Text;
                    str[7] = textBox8.Text;


                    saveprestolist(str);

                    tBoxDataIN.Text = "";
                }
            }
        }
        #endregion

        private void saveprestolist(string[] strpres)//listview控件处理数据  可视化
        #region
        {
            ListViewItem myItem = new ListViewItem(); //实例化一个listviewitem
            myItem = listView1.Items.Add((listView1.Items.Count + 1).ToString());//加载砖块样式
            for (int i = 0; i < strpres.Length; i++)
            {
                myItem.SubItems.Add(strpres[i].ToString());
            }
        }
        #endregion

        private void button2_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
            timer1.Start();
            Disp_charts();
        }

        private void timer1_Tick(object sender, EventArgs e)//设置时间多步采集,并将新的数据处理传输给图像处理位置
        #region
        {
            listTostring();
            double a = Convert.ToDouble(txbAI.Text);
            g_datanext1 = a;
            list1.Remove(0);
            list1.Add(g_datanext1);

            double b = Convert.ToDouble(txbBI.Text);
            g_datanext2 = b;
            list2.Remove(0);
            list2.Add(g_datanext2);

            double c = Convert.ToDouble(txbCI.Text);
            g_datanext3 = c;
            list3.Remove(0);
            list3.Add(g_datanext3);

            double d = Convert.ToDouble(txbAU.Text);
            g_datanext4 = d;
            list4.Remove(0);
            list4.Add(g_datanext4);

            double f = Convert.ToDouble(txbBU.Text);
            g_datanext5 = f;
            list5.Remove(0);
            list5.Add(g_datanext5);

            double g = Convert.ToDouble(txbCU.Text);
            g_datanext6 = g;
            list6.Remove(0);
            list6.Add(g_datanext6);



            Disp_charts();
        }
        #endregion

        private void timer2_Tick(object sender, EventArgs e)
        {

        }

        private void tBoxDataIN_TextChanged(object sender, EventArgs e)//文本框改变时输出数据长度
        {
            int s = tBoxDataIN.Text.Length;
            lblDataINLength.Text = Convert.ToString(s);
        }

        private void btnClearDataOut_Click(object sender, EventArgs e)//清空
        #region
        {
            textBox1.Text = "";
            textBox2.Text = "";
            textBox3.Text = "";
            textBox4.Text = "";
            textBox5.Text = "";
            textBox6.Text = "";
            textBox7.Text = "";
            textBox8.Text = "";
        }
        #endregion

        private void btnClearDataIN_Click(object sender, EventArgs e)//清空
        {
            tBoxDataIN.Text = "";
        }

        private void button3_Click(object sender, EventArgs e)//停止采集
        {
            timer1.Enabled = false;
            timer1.Stop();
        }

        private void button4_Click(object sender, EventArgs e)//导出数据至控件按钮
        #region
        {
            new Excel().WriteExcel_Table("table1.xlsx", GetDgvToTable(dataGridView1));
        }
        #endregion

        private DataTable GetDgvToTable(DataGridView dgv)//datagridview设置行列
        #region
        {
            DataTable dt = new DataTable();
            // 列强制转换
            for (int count = 0; count < dgv.Columns.Count; count++)
            {
                DataColumn dc = new DataColumn(dgv.Columns[count].Name.ToString());
                dt.Columns.Add(dc);
            }
            // 循环行
            for (int count = 0; count < dgv.Rows.Count; count++)
            {
                DataRow dr = dt.NewRow();
                for (int countsub = 0; countsub < dgv.Columns.Count; countsub++)
                {
                    dr[countsub] = Convert.ToString(dgv.Rows[count].Cells[countsub].Value);
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }
        #endregion
    }

}

使用到了null值的属性导致的,在箭头代码打断点,f11一步一步执行看是那句

img