//复位函数 public static void reset() { int sendCount = 0;//每条指令最多发送的次数变量,如果次数超过则报错 //UsbIO.sendToARM(Form1.SCPIReset + SCPIStrSumChkGet(Form1.SCPIReset) + Form1.end1 + Form1.end2); UsbIO.sendToARM(Form1.SCPIReset); Form1.Delay(40);//先延时40ms,然后判断是否返回接收成功的信息,如果返回继续发送下一条,没返回则,每隔一段时间发送一次相同的请求,五次后还没返回正确信息则报错 while (!Form1.SCPIsendSuccessFlag) { sendCount++; Form1.Delay(900);//延时900ms if (sendCount < 5) { //UsbIO.sendToARM(Form1.SCPIReset + SCPIStrSumChkGet(Form1.SCPIReset) + Form1.end1 + Form1.end2); UsbIO.sendToARM(Form1.SCPIReset); } else { break; } Form1.SCPIsendSuccessFlag = false; //返回该指令的接收成功信息后再把标志置为false } Form1.SCPIsendSuccessFlag = false; //返回该指令的接收成功信息后再把标志置为false if (sendCount < 5) { sendCount = 0; Form1.dialogMessageShow("复位成功!"); } else { Form1.dialogMessageShow("设备复位失败,请检查设备!"); } }
//从参数设置里读取内容,并判断设备连接状态和参数设置是否为空 private void ReadSet() { setData.testVoltage = textBox10.Text; //得到设置的测试电压值 setData.electricUpLimit = textBox9.Text; //得到设置的充电电流上限值 setData.powerUpLimit = textBox8.Text; //得到充电功率上限值 setData.outputRes = comboBox1.Text; //得到输出电阻值 setData.dischargeElectric = textBox7.Text; //得到放电电流值 setData.dischargePower = textBox1.Text; //得到放电功率值 setData.measurePattern = comboBox3.Text; //得到测量模式 setData.voltageRiseSlope = textBox3.Text; //(高压源的最大输出电压)电压上升斜率 setData.voltageDropSlope = textBox4.Text; //(高压源的最大输出电压)电压下降斜率 setData.chargePattern = comboBox2.Text; //得到充电模式 //判断设置参数是否填写完整 if (UsbIO.is_Open()) { if (setData.testVoltage == "" || setData.electricUpLimit == "" || setData.powerUpLimit == "" || setData.outputRes == "" || setData.dischargeElectric == "" || setData.dischargePower == "" || setData.measurePattern == "" || setData.voltageRiseSlope == "" || setData.voltageDropSlope == "" || setData.chargePattern == "" ) { MessageBox.Show("设置参数不能为空,请填写完整!"); //弹出提示对话框 } else { SendDataHandle.SendToCMDMachine(setData);//用于发送设置参数到下位机 } } else { MessageBox.Show("设备未连接!");//弹出提示对话框 } }
//关闭连接按钮 private void button2_Click(object sender, EventArgs e) { if (UsbIO.is_Open())//确保是设备处于连接状态才进行关闭连接的操作 { if (!testStartFlag) { closeTest(); //关闭接收数据 SendDataHandle.SCPICDisconnect(); //先向下位机发送退出远控状态的指令 UsbIO.DataRecieveStop(); //结束串口接收数据的线程 UsbIO.Close_Port(); //关闭串口连接 if (!UsbIO.is_Open()) { MessageBox.Show("设备已断开连接"); //弹出提示对话框 textBox11.Text = "设备未连接"; //显示设备连接状态 textBox11.BackColor = Color.WhiteSmoke; //控件背景颜色改变 } else { MessageBox.Show("设备连接断开失败"); //弹出提示对话框 } } else { MessageBox.Show("请先结束测试!"); //弹出提示对话框 } } }
//打开连接按钮 private void button1_Click(object sender, EventArgs e) { if (!UsbIO.is_Open())//确保设备处于未连接状态再进行连接操作,否则不操作 { portNum = PortNums.Text; UsbIO.Open_Port(); // 打开串口 UsbIO.DataRecieveStart(); //开始串口接收数据的线程 if (UsbIO.is_Open()) { bool successFlag = SendDataHandle.SCPIConnect();//发送SCPI联机指令给下位机 if (successFlag) { MessageBox.Show("设备连接成功"); //弹出提示对话框 textBox11.Text = "设备已连接"; //显示设备连接状态 textBox11.BackColor = Color.Red; //控件背景颜色改变 } else { MessageBox.Show("设备连接失败"); //弹出提示对话框 textBox11.Text = "设备未连接"; //显示设备连接状态 textBox11.BackColor = Color.WhiteSmoke; //控件背景颜色改变 } } else { MessageBox.Show("串口未打开"); //弹出提示对话框 textBox11.Text = "设备未连接"; //显示设备连接状态 textBox11.BackColor = Color.WhiteSmoke; //控件背景颜色改变 } } }
//form1加载时的显示(设置里面的下拉选项) private void Form1_Load(object sender, EventArgs e) { //枚举(列出)参数设置里面的输出电阻值 comboBox1.Items.Add("NONE"); comboBox1.Items.Add("DIOD"); comboBox1.Items.Add("100K"); comboBox1.Items.Add("1M"); comboBox1.Items.Add("10M"); comboBox1.SelectedIndex = 1; //下拉列表默认选择项是第二项,即:DIOD //枚举(列出)参数设置里面的测量模式 comboBox3.Items.Add("IR"); comboBox3.Items.Add("LC"); comboBox3.SelectedIndex = 0; //下拉列表默认选择项是第一项,即:IR //枚举(列出)参数设置里面的充电模式 comboBox2.Items.Add("Auto"); comboBox2.Items.Add("Manu"); comboBox2.SelectedIndex = 0; //下拉列表默认选择项是第一项,即:IR //保证下拉框只能选择不能自己填入 comboBox1.DropDownStyle = ComboBoxStyle.DropDownList; comboBox2.DropDownStyle = ComboBoxStyle.DropDownList; comboBox3.DropDownStyle = ComboBoxStyle.DropDownList; PortNums.DropDownStyle = ComboBoxStyle.DropDownList; string[] portNums = UsbIO.getComNums(); // 打开硬件设备,获取到端口号 //枚举(列出)获得的串口号 foreach (string s in portNums) { PortNums.Items.Add(s); } PortNums.SelectedIndex = 0; //下拉列表默认选择项是第一个串口号 UsbIO.setForm(this); //创建一个实例,把该界面和UsbIO中的静态变量form1绑定在一起 }
//停止接收数据函数 public static void closeTest() { //SendDataHandle.SCPITestStop();//给下位机发送停止测试的指令 receiveStartFlag = false; //开始发送请求结果数据标志位置1 UsbIO.form1.timer1.Stop(); //关闭定时器 UsbIO.DataRecieveStop(); //停止接收接收数据 Form1.isGather = false; //停止绘图显示的线程 //Form1.testStartFlag = false;//开始测试标志置零 //UsbIO.form1.textBox14.Text = "测试未开始"; //显示测试状态 }
//停止接受数据按钮 private void button8_Click(object sender, EventArgs e) { if (UsbIO.is_Open()) { closeTest(); } else { MessageBox.Show("设备未连接,请先连接设备"); //弹出提示对话框 } }
//开始接受数据按钮(向下位机请求结果数据) private void button6_Click(object sender, EventArgs e) { if (UsbIO.is_Open()) { TaskGatherRealTime = new Thread(GatherRealTime); //开启(创建)一个绘图线程 startTest(); receiveButtonClickFlag = true; //开始接收数据的按钮是否点击过 } else { MessageBox.Show("设备未连接,请先连接设备"); //弹出提示对话框 } }
//开始测试按钮 private void button3_Click(object sender, EventArgs e) { if (UsbIO.is_Open()) { //TaskGatherRealTime = new Thread(GatherRealTime);//开启(创建)一个绘图线程 //startTest();//调用测试开始的函数 testStartFlag = true; //开始测试标志置一 SendDataHandle.SCPITestStart(); //给下位机发送开始测试的指令 UsbIO.form1.textBox14.Text = "正在测试"; //显示测试状态 textBox14.BackColor = Color.Red; //控件背景颜色改变 } else { MessageBox.Show("设备未连接,请先连接设备"); //弹出提示对话框 } }
//发送设置参数到下位机 public static void SendToCMDMachine(SysSet.SettingsStruct setData) { string[] packData = PackageData(setData); //把设置参数封装成SCPI指令 //需要添加参数发送成功标志,通过条件判断,读取返回的设置成功与否的标志 int sendCount = 0; //每条指令最多发送的次数变量,如果次数超过则报错 bool setDataDownloadSuccessFlag = true; //设置参数全部下载到下位机的成功标志 foreach (string s in packData) { UsbIO.sendToARM(s); Form1.Delay(40);//先延时40ms,然后判断是否返回接收成功的信息,如果返回继续发送下一条,没返回则,每隔一段时间发送一次相同的请求,五次后还没返回正确信息则报错 while (!Form1.SCPIsendSuccessFlag) { sendCount++; Form1.Delay(900);//延时900ms if (sendCount < 5) { UsbIO.sendToARM(s); } else { setDataDownloadSuccessFlag = false; break; } } if (sendCount < 5) { sendCount = 0; } else { break; } Form1.SCPIsendSuccessFlag = false;//返回该指令的接收成功信息后再把标志置为false } Form1.SCPIsendSuccessFlag = false;//返回该指令的接收成功信息后再把标志置为false if (setDataDownloadSuccessFlag) { Form1.dialogMessageShow("参数下载成功!"); //弹出提示对话框 Form1.setDataDownloadSuccessFlag = true; //参数下载成功的标志 } else { Form1.dialogMessageShow("参数下载失败,请检查设备并重新下载!");//弹出提示对话框 } }
//发送SCPI模块联机顺序指令到下位机中 public static bool SCPIConnect() { int sendCount = 0;//每条指令最多发送的次数变量,如果次数超过则报错 foreach (string s in Form1.SCPIConnect) { //UsbIO.sendToARM(s+ SCPIStrSumChkGet(s) + Form1.end1+Form1.end2); UsbIO.sendToARM(s); Form1.Delay(40);//先延时40ms,然后判断是否返回接收成功的信息,如果返回继续发送下一条,没返回则,每隔一段时间发送一次相同的请求,五次后还没返回正确信息则报错 while (!Form1.SCPIsendSuccessFlag) { sendCount++; Form1.Delay(900);//延时900ms if (sendCount < 5) { //UsbIO.sendToARM(s + SCPIStrSumChkGet(s) + Form1.end1 + Form1.end2); UsbIO.sendToARM(s); } else { break; } } if (sendCount < 5) { sendCount = 0; } else { Form1.dialogMessageShow("SCPI联机指令发送失败"); break; } Form1.SCPIsendSuccessFlag = false;//返回该指令的接收成功信息后再把标志置为false } //UsbIO.sendToARM(Form1.successReceiveMes + SCPIStrSumChkGet(Form1.successReceiveMes) + Form1.end1 + Form1.end2); Form1.SCPIsendSuccessFlag = false;//返回该指令的接收成功信息后再把标志置为false if (sendCount == 0) { return(true); } else { return(false); } }
//开始接收数据的函数 public static void startTest() { UsbIO.DataRecieveStart(); //开始接收数据 TaskGatherRealTime.Start(); //开始接受绘图数据的线程 if (!receiveButtonClickFlag) { SaveDataToLocal.createPathFile();//创建指定目录和存储数据的txt文件 } //testStartFlag = true;//开始测试标志置一 //SendDataHandle.SCPITestStart();//给下位机发送开始测试的指令 //UsbIO.form1.textBox14.Text = "正在测试"; //显示测试状态 UsbIO.form1.timer1.Interval = Convert.ToInt32(UsbIO.form1.textBox2.Text);//把设置的请求时间间隔设置到定时器1中去 float a = UsbIO.form1.timer1.Interval; xUnitTime = a / 1000; //趋势图单个横坐标单位长度 receiveStartFlag = true; //开始发送请求结果数据标志位置1 UsbIO.form1.timer1.Start(); //开启定时器 }
//发送请求结果数据的函数 public static void sendGet(string[] str) { bool setDataDownloadSuccessFlag = true;//请求结果的SCPI指令全部下载到下位机的成功标志 int sendCount = 0; foreach (string s in str) { UsbIO.sendToARM(s); Form1.Delay(40);//先延时40ms,然后判断是否返回接收成功的信息,如果返回继续发送下一条,没返回则,每隔一段时间发送一次相同的请求,五次后还没返回正确信息则报错 while (!Form1.SCPIsendSuccessFlag) { sendCount++; Form1.Delay(900);//延时900ms if (sendCount < 5) { UsbIO.sendToARM(s); } else { //五次连续发送该条指令都没有返回接收成功的返回信息,则参数请求失败 setDataDownloadSuccessFlag = false; break; } } if (sendCount < 5) { sendCount = 0; } else { break; } Form1.SCPIsendSuccessFlag = false; //返回该指令的接收成功信息后再把标志置为false } Form1.SCPIsendSuccessFlag = false; //返回该指令的接收成功信息后再把标志置为false if (!setDataDownloadSuccessFlag) { Form1.dialogMessageShow("结果参数请求失败,测试已停止,请检查设备!"); //弹出提示对话框 //是否关闭测试? Form1.closeTest(); //调用关闭测试的函数 } }
//校验得到的SCPI指令是否正确 public static void SCPIReceiveCheck(byte[] buf) { int sum = 0; for (int i = 0; i < buf.Length - 3; i++) { sum += buf[i]; } byte low = (byte)(sum & 0xFF); low = (byte)(low | 0x80); if (low == buf[buf.Length - 3]) { SCPIReceiveAnalysis(Form1.receiveTempData.ToArray());//显示并解析收到的SCPI指令 } else { UsbIO.sendToARM(Form1.errorCode + Form1.end1 + Form1.end2);//返回指令校验错误信息 Form1.dialogMessageShow("接收的指令校验结果出错"); } }
//参数下载按钮 private void button5_Click(object sender, EventArgs e) { if (UsbIO.is_Open()) { ReadSet();//读取设置的参数,并在ReadSet函数里调用sendToCMDMachine函数把设置的参数发送给下位机 if (setDataDownloadSuccessFlag) { textBox13.Text = "参数下载成功"; textBox13.BackColor = Color.Red;//控件背景颜色改变 setDataDownloadSuccessFlag = false; } else { textBox13.Text = "参数下载失败"; textBox13.BackColor = Color.Red;//控件背景颜色改变 } } else { MessageBox.Show("设备未连接,请先连接设备"); //弹出提示对话框 } }
//判断并得到SCPI指令 public static void SCPIReceiveJudge(byte[] buf) { bool endFlag = false;//用来判断结束码的两个字节均满足要求 foreach (byte b in buf) { Form1.receiveTempData.Add(b); if (b == Form1.end1) { endFlag = true; } if (b == Form1.end2 && endFlag) { endFlag = false; UsbIO.receiveDataShow(System.Text.Encoding.Default.GetString(Form1.receiveTempData.ToArray())); //调用方法把接收到的SCPI指令信息显示到接收数据窗口 SCPIReceiveCheck(Form1.receiveTempData.ToArray()); //进行SCPI指令的校验码校验 Form1.receiveTempData.Clear(); //清空存储SCPI指令的字节列表 } } }