//复位函数 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("设备复位失败,请检查设备!"); } }
/*在SerialPort类中有DataReceived事件,当串口的读缓存 * 有数据到达时则触发DataReceived事件,其中SerialPort.ReceivedBytesThreshold属性决 * 定了当串口读缓存中数据多少个时才触发DataReceived事件,默认为1。 */ //数据接收处理函数 public static void DataRecieve(object sender, SerialDataReceivedEventArgs e) { Form1.Delay(10); //延时10毫秒,已达到直接读取整个一条指令的目的 int count = port.BytesToRead; //获取输入缓冲区的字节个数 if (count <= 0) { return; } lock ("lock") { byte[] buf = new byte[count]; //建立一个与缓冲区字节数大小相等字节数组 port.Read(buf, 0, count); //把缓冲区的数据存入buf数组 ReceiveDataHandle.SCPIReceiveJudge(buf); //根据SCPI协议对从缓冲区读入的数据进行解析,并进行相应的数据操作 } }
//发送设置参数到下位机 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 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(); //调用关闭测试的函数 } }