FormConfig.cs_200528

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
//using System.Text;
using MT8852B_Driver;
using System.IO;

namespace NRF52382_Test
{

public partial class FormConfig : Form
{
    FormMain frmMain = new FormMain();

    public void LoadXMLToDataGridView()
    {
        XmlTextReader xml = null;
        DataTable dt = null;
        string strMsg = "";
        try
        {
            dt = new DataTable();
            //添加列名
            dt.Columns.Add("TestCase", typeof(string));
            dt.Columns.Add("Parameter", typeof(string));
            dt.Columns.Add("Enable", typeof(string));
            //dt.Columns.Add("1", typeof(DataGridViewButtonColumn));
            //dt.Columns.Add("Description", typeof(string));

            string strJsonfile = System.Environment.CurrentDirectory + "\\TestSrcipt.xml";
            xml = new XmlTextReader(strJsonfile);
            xml.WhitespaceHandling = WhitespaceHandling.None;

            while (xml.Read())
            {
                if (xml.NodeType == XmlNodeType.Element)
                {
                    if (xml.Name == "COM")
                    {
                        tbCOM.Text = xml.ReadString();
                    }
                    if (xml.Name == "GPIB_Index")
                    {
                        List<string> ls = new List<string>();
                        string strTmp = xml.GetAttribute("Elements");
                        List<string> list = new List<string>(strTmp.Split(','));
                        list.ForEach(i => ls.Add(i));

                        string strCurrVaule = xml.ReadString();
                        ls.ForEach(x => cbGpibIndex.Items.Add(x.ToString()));
                        cbGpibIndex.SelectedIndex = cbGpibIndex.Items.IndexOf(strCurrVaule);

                        //cbGpibIndex.Text = xml.ReadString();
                    }
                    if (xml.Name == "GPIB_Address")
                    {
                        tbGpibAddress.Text = xml.ReadString();
                    }

                    if (xml.Name == "TestCase1" || xml.Name == "TestCase2" || xml.Name == "TestCase3" || xml.Name == "TestCase4" || xml.Name == "TestCase5" || xml.Name == "TestCase6" || xml.Name == "TestCase7" || xml.Name == "TestCase8" || xml.Name == "TestCase9")
                    {
                        DataRow dr = dt.NewRow();
                        string strCaseName = xml.GetAttribute("Name");
                        dr["TestCase"] = strCaseName;
                        string strVaule = xml.GetAttribute("Value");
                        dr["Parameter"] = strVaule;
                        string strEnable = xml.GetAttribute("Enable");                            
                        dr["Enable"] = strEnable;
                        dt.Rows.Add(dr);                          
                    }                        
                }                   
            }
            //创建DataSet对象,绑定数据
            DataSet ds = new DataSet();
            ds.Tables.Add(dt);
            dataGridView1.DataSource = dt;
            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

            //for(int i = 0;i<dt.Columns.Count-1;i++)
            {
                DataGridViewButtonColumn btn = new DataGridViewButtonColumn();
                btn.Name = "btnModify";
                btn.HeaderText = "修改";
                btn.DefaultCellStyle.NullValue = "修改";
                dataGridView1.Columns.Add(btn);
            }
        }
        catch (XmlException xmlEx)
        {
            strMsg = xmlEx.Message.ToString();
            MessageBox.Show(strMsg);
        }
        catch (DataException dataEx)
        {
            strMsg = dataEx.Message.ToString();
            MessageBox.Show(strMsg);
        }
        catch (SystemException sysEx)
        {
            strMsg = sysEx.Message.ToString();
            MessageBox.Show(strMsg);
        }
        finally
        {
            xml.Close();
        }
    }

    public void SaveXMLFromDataGridView()
    {
        string strTmp = "";
        string strMsg = "";
        string strJsonfile = System.Environment.CurrentDirectory + "\\TestSrcipt.xml";
        XmlDocument xml = null;
        try
        {
            xml = new XmlDocument();
            xml.Load(strJsonfile);

            XmlElement pXmlElement = xml.SelectSingleNode(@"configuration/BtTest/Init/COM") as XmlElement;
            pXmlElement.InnerText = tbCOM.Text;

            pXmlElement = xml.SelectSingleNode(@"configuration/BtTest/Init/GPIB_Index") as XmlElement;
            pXmlElement.InnerText = cbGpibIndex.Text;

            pXmlElement = xml.SelectSingleNode(@"configuration/BtTest/Init/GPIB_Address") as XmlElement;
            pXmlElement.InnerText = tbGpibAddress.Text;


            for (int i = 0; i < 9; i++)
            {
                string strTmp2 = string.Format("configuration/BtTest/TestCase/TestCase{0}", (i + 1));
                pXmlElement = xml.SelectSingleNode(strTmp2) as XmlElement;
                strTmp = dataGridView1["Parameter", i].Value.ToString();
                pXmlElement.SetAttribute("Value", strTmp);
                //pXmlElement.InnerText = strTmp;
            }
            xml.Save(strJsonfile);
            MessageBox.Show("数据保存成功!");
            this.Close();
        }
        catch (XmlException xmlEx)
        {
            strMsg = xmlEx.Message.ToString();
            MessageBox.Show(strMsg);
        }
        catch (DataException dataEx)
        {
            strMsg = dataEx.Message.ToString();
            MessageBox.Show(strMsg);
        }
        catch (SystemException sysEx)
        {
            strMsg = sysEx.Message.ToString();
            MessageBox.Show(strMsg);
        }
        finally
        {
        }
    }

    public FormConfig()
    {
        InitializeComponent();
        LoadXMLToDataGridView();
    }


    public FormConfig(FormMain formMain)
    {
        frmMain = formMain;
        InitializeComponent();
    }


    #region 直接删除指定目录下的所有文件及文件夹(保留目录)
    public static void DeleteDir(string file)
    {
        try
        {
            //去除文件夹和子文件的只读属性
            //去除文件夹的只读属性
            System.IO.DirectoryInfo fileInfo = new DirectoryInfo(file);
            fileInfo.Attributes = FileAttributes.Normal & FileAttributes.Directory;

            //去除文件的只读属性
            System.IO.File.SetAttributes(file, System.IO.FileAttributes.Normal);

            //判断文件夹是否还存在
            if (Directory.Exists(file))
            {
                foreach (string f in Directory.GetFileSystemEntries(file))
                {
                    if (File.Exists(f))
                    {
                        //如果有子文件删除文件
                        File.Delete(f);
                        Console.WriteLine(f);
                    }
                    else
                    {
                        //循环递归删除子文件夹
                        DeleteDir(f);
                    }
                }

                //删除空文件夹
                //Directory.Delete(file);
                Console.WriteLine(file);
            }

        }
        catch (Exception ex) // 异常处理
        {
            Console.WriteLine(ex.Message.ToString());// 异常信息
        }
    }

    #endregion

    //public delegate void ShowStatedelegate(string txt);//定义一个委托
    //public event mydelegate myevent;

   
    private void FormConfig_Load(object sender, EventArgs e)
    {
        LoadXMLToDataGridView();
        FormLogin frmLogin = new FormLogin();
        frmLogin.ShowDialog();
        if (frmLogin.DialogResult == DialogResult.OK)//如果登录框返回DialogResult.OK
        {
            //MessageBox.Show("正常登录");
        }
        else
        {
            this.Close();
        }
    }

    private void ReportClear_Click(object sender, EventArgs e)
    {
        //清除文件夹的所有文件
        DeleteDir(System.Environment.CurrentDirectory + "\\Log\\");
        DeleteDir(System.Environment.CurrentDirectory + "\\CSV\\");

        frmMain.tbPass.Text = "0";
        frmMain.tbFail.Text = "0";
        frmMain.tbTotal.Text = "0";
        frmMain.tbFYP.Text = "100%";
        frmMain.ResetFYP();
    }

    private void btSave_Click(object sender, EventArgs e)
    {
        SaveXMLFromDataGridView();
    }

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        if (dataGridView1.Columns[e.ColumnIndex].Name == "btnModify" && e.RowIndex >= 0)
        {
            TxTestCase TxTestPara = new TxTestCase();
            RxTestCase RxTestPara = new RxTestCase();

            
            string strVaule = Convert.ToString(dataGridView1.CurrentRow.Cells[1].Value);
            List<string> listPara = new List<string>(strVaule.Split(','));
            TxTestPara.iTxBLEStandard = Convert.ToInt16(listPara[1]);
            TxTestPara.channel = (E_Channel)Convert.ToInt16(listPara[2]);
            TxTestPara.iRange = Convert.ToInt16(listPara[3]);
            TxTestPara.sFixedOffset = listPara[4];

            TxTestPara.iTrigger = Convert.ToInt16(listPara[5]);
            TxTestPara.sCapturePeriod = listPara[6];
            TxTestPara.sSyscWord0x = listPara[7];
            TxTestPara.iPayload = Convert.ToInt16(listPara[8]);
            TxTestPara.sAnternnaPattern = listPara[9];

            TxTestPara.IsTest_OutputPower = listPara[10] == "1" ? true : false;
            TxTestPara.IsTest_CarrierDrift = listPara[11] == "1" ? true : false;
            TxTestPara.IsTest_ModulationIndex = listPara[12] == "1" ? true : false;

            RxTestPara.iRxBLEStandard = Convert.ToInt16(listPara[14]);
            RxTestPara.channel = (E_Channel)Convert.ToInt16(listPara[15]);
            RxTestPara.sPowerLevel = listPara[16];
            RxTestPara.sLoss = listPara[17];
            RxTestPara.iPayload = Convert.ToInt16(listPara[18]);
            RxTestPara.sSyscWord0x = listPara[19];
            RxTestPara.sSpacing = listPara[20];
            RxTestPara.sPackets = listPara[21];
            RxTestPara.sCTELength = listPara[22];

            RxTestPara.iSlotDuration = Convert.ToInt16(listPara[23]);
            RxTestPara.iDirtyTransmitter = Convert.ToInt16(listPara[24]);
            RxTestPara.iAlternateBadCRC = Convert.ToInt16(listPara[25]);
                        

            string strTxRxEnable = Convert.ToString(dataGridView1.CurrentRow.Cells[2].Value);
            List<string> listRxTxEnable = new List<string>(strTxRxEnable.Split(','));
            if(listRxTxEnable[0] == "1")
            {
                TxTestPara.bTxCaseEnable = true;
            }
            else
            {
                TxTestPara.bTxCaseEnable = false;
            }
            if(listRxTxEnable[1] == "0")
            {
                RxTestPara.bRxCaseEnable = true;
            }
            else
            {
                RxTestPara.bRxCaseEnable = false;
            }
            FormTxRxParaConfig formTRCfg = new FormTxRxParaConfig(TxTestPara,RxTestPara);
             formTRCfg.ShowDialog();
        }          
    }
}

}

<think>好的,我现在要帮用户解决在ABB_PCSDK开发中遇到的System.NullReferenceException异常,错误出现在Form1.cs的第335行。首先,我需要回顾用户提供的引用信息,尤其是与ABB相关的解决方案和之前的对话内容。 用户之前提到过ABB.Robotics.GenericControllerException,这可能和当前的NullReferenceException有关联吗?需要看看这两个异常是否在相同上下文中出现,比如网络连接问题或SDK配置错误。但NullReferenceException通常是代码层面的对象未初始化问题,而GenericControllerException更多是通信或权限问题,不过可能在某些情况下,比如SDK对象未正确初始化导致后续异常。 接下来,用户提供的引用中有几个关于NullReferenceException的例子,比如变量名拼写错误(Port写成Prot)、配置文件中连接字符串缺失、控件未初始化等。这些例子说明NullReferenceException常见于对象未实例化、变量名错误、配置错误等情况。需要将这些经验应用到当前的问题中。 用户当前的错误出现在Form1.cs的第335行,涉及ABB_PCSDK。可能的场景包括:访问未初始化的控制器对象、SDK组件未正确加载、配置参数错误等。比如,在使用PC SDK时,可能没有正确初始化Controller对象,或者在调用其方法前未检查是否为null。 根据引用[3]中的情况,检查是否有类似配置问题,比如SDK需要的配置文件是否正确,连接参数是否正确设置。引用[4]提到事件加载顺序的问题,如果Form1_Resize在Load事件之前执行,可能导致控件未初始化,同样,如果在Form1.cs中某些SDK相关的初始化代码没有在正确的事件中执行,可能导致对象为null。 此外,用户之前的问题中提到了网络验证、服务安装、权限配置等,这些虽然主要是针对GenericControllerException,但如果SDK组件未正确安装或配置,可能导致某些对象无法创建,从而引发NullReferenceException。例如,如果PC SDK服务未安装,尝试初始化控制器对象时可能返回null,导致后续调用方法时抛出NullReferenceException。 现在需要综合这些信息,给出具体的解决方案步骤。首先,检查第335行代码,确认所有对象是否已经实例化,变量名是否正确。然后,验证SDK的初始化流程是否正确,比如Controller对象的创建和登录步骤是否完成。接着,检查配置文件或连接参数是否正确,是否有拼写错误。另外,确保事件顺序正确,比如初始化代码在Form Load事件中执行,而不是在构造函数或其他可能未完成初始化的地方。 可能还需要检查SDK的版本兼容性,如用户之前提到的控制器和SDK版本对应表,如果版本不匹配,某些对象可能无法正确初始化。此外,启用SDK的日志功能,如之前的解决方案中的Trace.SetLevel,可以帮助捕获更详细的错误信息,定位null引用的来源。 最后,总结可能的原因和对应的解决方法,确保用户能够逐步排查,从代码检查、SDK配置、初始化流程到日志分析,覆盖所有可能的情况。</think>#### 针对ABB_PCSDK中`System.NullReferenceException`的深度解决方案(Form1.cs第335行) --- ### 一、异常根本原因 该异常表明在操作对象时**未正确初始化或引用已释放的资源**,结合ABB_PCSDK开发场景,常见原因包括: 1. **SDK对象未初始化**:未正确创建`Controller`实例或未完成登录流程 2. **异步操作时序错误**:在控制器连接完成前尝试调用方法 3. **配置参数缺失**:缺少`Web.config`/`App.config`中的关键配置项[^3] 4. **变量命名错误**:类似引用[1]中`Port`拼写为`Prot`的输入错误 5. **事件顺序冲突**:窗体控件初始化未完成即触发事件(如引用[4]) --- ### 二、具体排查步骤 #### 1. **定位问题代码** 检查`Form1.cs`第335行附近代码(示例): ```csharp // 典型错误场景 var rapidData = controller.Rapid.GetRapidData(); // 若controller未初始化则报错 ``` 需验证以下对象链: - `controller`是否通过`new Controller(...)`实例化 - `controller.Logon(user)`是否已成功执行 - `Rapid`属性是否为null #### 2. **SDK初始化验证** ```csharp // 正确初始化流程示例 var controller = new Controller("IRB1200", new NetworkConnection(robotIP), UserInfo.DefaultUser); // 必须显式创建实例 if (!controller.Connected) { controller.Logon(UserInfo.DefaultUser); // 检查登录返回值 } ``` #### 3. **配置项检查 在`App.config`中确认SDK所需配置: ```xml <configuration> <appSettings> <add key="PC_SDK_Version" value="7.1"/> <!-- 需与控制器版本匹配 --> <add key="RobotIP" value="192.168.125.1"/> </appSettings> </configuration> ``` #### 4. **异步操作保护 使用`Invoke`方法确保线程安全: ```csharp if (this.InvokeRequired) { this.Invoke(new Action(() => { controller.Rapid.GetRapidData(); // 确保在UI线程访问 })); } ``` #### 5. **SDK日志分析 启用ABB专用日志定位null来源: ```csharp ABB.Robotics.Tracing.Trace.SetLevel(TraceLevel.Debug); Trace.Listeners.Add(new TextWriterTraceListener("ABB_PCSDK.log")); ``` --- ### 三、ABB特定场景解决方案 | 问题类型 | 验证方法 | 修复方案 | |---------|---------|---------| | **控制器未连接** | 检查`controller.ConnectionStatus` | 执行`controller.Connect()`并处理异常 | | **Rapid模块未加载** | 检查`controller.Rapid == null` | 确认控制器已加载RAPID任务 | | **用户权限不足** | 检查`UserInfo`配置 | 使用`UserInfo.DefaultUser`或配置白名单 | | **SDK版本冲突** | 对比`PC SDK`与`RobotWare`版本 | 参考版本兼容表升级组件[^历史回答] | --- ### 四、预防措施 1. **使用安全访问模式**: ```csharp if (controller?.Rapid?.GetRapidData() != null) // C# 6.0 null条件运算符 { // 安全操作 } ``` 2. **添加全局异常捕获**: ```csharp AppDomain.CurrentDomain.UnhandledException += (s, e) => { File.WriteAllText("crash.log", e.ExceptionObject.ToString()); }; ``` 3. **单元测试验证**: ```csharp [TestMethod] public void ControllerInitializationTest() { var controller = new Controller(...); Assert.IsNotNull(controller.Rapid); } ``` --- ### 五、关联问题扩展 1. ABB控制器`Connected`状态为false时如何处理? 2. 如何通过PC SDK安全地访问RAPID变量? 3. RobotWare版本升级后SDK兼容性验证方法? --- [^历史回答]: 参考版本兼容表见前次回复的"进阶排查方法"表格 [^3]: 配置项缺失问题参考用户提供的SQL连接配置案例
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值