///----------------------------------------------------------------- /// <summary> /// 对 象:SCIPort /// 事 件:DataReceived /// 功 能:串口接收数据 /// 函数调用:(1)SCIReceiveData,串口接收函数 /// (2)SCIUpdateRevtxtbox,更新文本框中的内容 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> ///----------------------------------------------------------------- private void SCIPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { String str = String.Empty; bool Flag; //标记串口接收数据是否成功 int len; //标记接收的数据的长度 byte[] ch2 = new byte[2]; //ComDevice.Encoding = System.Text.Encoding.GetEncoding("GB2312"); //调用串口接收函数,并返回结果 Flag = sci.SCIReceiveData(ref PublicVar.g_ReceiveByteArray); if (Flag == true) //串口接收数据成功 { if (PublicVar.g_ReceiveByteArray.Length >= 2) { int temp = PublicVar.Temp[0] = PublicVar.g_ReceiveByteArray[0]; int mcu_temp = PublicVar.Temp[1] = PublicVar.g_ReceiveByteArray[1]; string s1 = " " + temp + "℃"; string s2 = " " + mcu_temp; SCIUpdateRevtxtbox(textBox1, s1); SCIUpdateRevtxtbox(textBox2, s2); } /*len = PublicVar.g_ReceiveByteArray.Length; * //对于字符串形式,考虑到可能有汉字, * //直接调用系统定义的函数,处理整个字符串 * str = Encoding.GetEncoding("GB2312").GetString(PublicVar.g_ReceiveByteArray); * * SCIUpdateRevtxtbox(TbShowString, str); * * //十进制和十六进制形式按字节进行处理 * for (int i = 0; i < len; i++) * { * //十进制都是按照三位来显示,字节之间有空格表示区分 * SCIUpdateRevtxtbox(TbShowDec, * PublicVar.g_ReceiveByteArray[i].ToString("D3") + " "); * //十六进制都是按照两位来显示,字节之间有空格表示区分 * * SCIUpdateRevtxtbox(TbShowHex, * PublicVar.g_ReceiveByteArray[i].ToString("X2") + " "); * }*/ // sci.SCIReceInt(SCIPort, 1);//设置产生接收中断的字节数【2014-5-5 注释,否则会导致程序无响应】 this.TSSLState.Text = "过程提示:数据接收成功!"; } //接收数据失败 else { //sci.SCIReceInt(SCIPort, 1);//设置产生接收中断的字节数【2014-5-5 注释,否则会导致程序无响应】 this.TSSLState.Text = "过程提示:数据接收失败!"; } }
//---------------------------单击“读测试(逻辑地址)”按钮---------------------------- private void btnPnFlashRead_Click(object sender, EventArgs e) { byte sector; //扇区号 int whi; //偏移量 byte n; //读取字节数 int i; byte len; // 2. 临时变量赋值tbOffset2 sector = Convert.ToByte(tbSector1.Text); // 将TextBox中的Text转换为Byte类型 //if (sector > 63 || sector < 55) //{ // MessageBox.Show("请输入正确扇区号!"); // return; //} whi = Convert.ToInt32(tbOffset1.Text); // 将TextBox中的Text转换为Byte类型 sector = (byte)(sector + whi); n = Convert.ToByte(tbCount1.Text); byte[] SendByteArray = new byte[5]; this.Txt_recv1.Text = ""; this.Txt_recv2.Text = ""; this.Txt_recv1.Refresh(); this.Txt_recv2.Refresh(); this.tb_statue.Text = "运行状态:" + "单击“终端UE Flash 逻辑读测试”按钮..."; this.tb_statue.Refresh(); try { SendByteArray[0] = (byte)'r'; SendByteArray[1] = sector; //第几页 SendByteArray[2] = (byte)(0 / 256); //偏移量高字节 SendByteArray[3] = (byte)(0 % 256); //偏移量低字节 SendByteArray[4] = n; //写入字节数 //发送、接收、显示 //sci.SCISendData(ref SendByteArray); bool flag = sci.SCISendFrameData(ref SendByteArray); Thread.Sleep(500); if (sci.SCIReceiveData(ref recvData)) { //MessageBox.Show(Encoding.Default.GetString(recvData)); string str = null; this.Txt_recv2.Text = Encoding.Default.GetString(recvData); for (int j = 0; j < recvData.Length; j++) { str += recvData[j].ToString("X2"); str += "-"; } this.Txt_recv1.Text = str; //16进制字符串 } } catch { this.Txt_recv1.Text = "终端UE Flash读取写入失败,检查UART_User串口连接是否成功!"; } }
//========================以下是本窗体的各个事件响应函数========================== //------------------------单击“检测PC节点”按钮---------------------------------- private void btnCheckPcNode_Click(object sender, EventArgs e) { //int ret; //返回值 //string com = ""; //串口信息 string sTemp = ""; //byte[] recv = null;//保存串口接收信息 //byte[] shake = { (byte)10, (byte)'s', (byte)'h', (byte)'a', (byte)'k', (byte)'e' }; //与终端握手帧数据 byte[] userShake = { (byte)11, (byte)'a', (byte)'u', (byte)'a', (byte)'r', (byte)'t', (byte)'?' }; //与终端握手帧数据 //byte[] send = { (byte)'S' }; string[] SCIPorts; SCIPorts = SCI.SCIGetPorts(); this.Refresh(); //刷新显示 //if (emuart._Uartport != null) emuart._Uartport.Close(); //Thread.Sleep(10); //等待串口关闭 //emuart = EMUART.getInstance(); //每次“重新连接”重新实例化 //ret = emuart.findDevice(out com, 115200); //寻找emuart设备 //this.lbl_PC_Node_State.Text = com; //右上角显示区 //if (ret == 1) goto btn_uartcheck_Click_EXIT1; ////(4.2)找到串口,没有找到UE,退出函数 //else if (ret == 2) goto btn_uartcheck_Click_EXIT2; //emuart.bufferClear(); //清除接收数组缓冲区 //emuart.send(shake, out recv, 200, 3); //获得设备的信息在recv中 //if (recv == null) goto btn_uartcheck_Click_EXIT3; //没有接收到设备返回消息 //if (recv.Length == Marshal.SizeOf(typeof(shakeData))) //{ // //byte数组转结构体 // shakedata = (shakeData)bytesToStruct(recv, typeof(shakeData)); // //获取握手帧数据 // uecomType = Encoding.Default.GetString(shakedata.uecomType).Replace("\0", ""); // mcuType = Encoding.Default.GetString(shakedata.mcuType).Replace("\0", ""); // //设置设备信息 // sTemp = com + ":" + uecomType + " " + mcuType; //设备信息 // //状态提示 // this.lbl_PC_Node_State.Text = sTemp; //右上角显示区 // this.btnPnFlashErase.Enabled = true; // this.btnPnFlashRead.Enabled = true; // this.btnPnFlashReadAddr.Enabled = true; // this.btnPnFlashWrite.Enabled = true; //} //else if (recv.Length == Marshal.SizeOf(typeof(newshakeData))) //{ int i; //byte数组转结构体 //newshakedata = (newshakeData)bytesToStruct(recv, typeof(newshakeData)); ////获取握手帧数据 //uecomType = Encoding.Default.GetString(newshakedata.uecomType).Replace("\0", ""); //mcuType = Encoding.Default.GetString(newshakedata.mcuType).Replace("\0", ""); //设置设备信息 //sTemp = com + ":" + uecomType + " " + mcuType; //设备信息 if (sci != null && sci.IsOpen) { sci.Close(); } //发送全局变量_SendByteArray中的数据,并返回结果 for (i = 0; i < SCIPorts.Length; i++) { //if (SCIPorts[i] == com) continue; sci = new SCI(SCIPorts[i], 115200); if (sci.SCIOpen()) { //sci.SCISendData(ref send); //发送与Uart_User串口握手的数据信息 sci.SCISendFrameData(ref userShake); Thread.Sleep(500); if (sci.SCIReceiveData(ref recvData)) { //MessageBox.Show(System.Text.Encoding.Default.GetString(recvData)); //if (recvData.Length == 0 || !System.Text.Encoding.Default.GetString(recvData).Contains("Yes,I am an emuart!!")) //{ // this.tb_statue.Text = "未找到终端设备"; // //this.lbl_PC_Node_State.Text = "未找到终端设备"; // MessageBox.Show("检查UART_User(KL36:UART0)串口有无接好"); // this.btnPnFlashErase.Enabled = false; // this.btnPnFlashRead.Enabled = false; // this.btnPnFlashReadAddr.Enabled = false; // this.btnPnFlashWrite.Enabled = false; // sci.Close(); // continue; //} if (System.Text.Encoding.Default.GetString(recvData).Contains("Yes,I am an emuart!!")) //记录UART_User串口的Com号 { string retInfo = System.Text.Encoding.Default.GetString(recvData); this.tb_statue.Text = "找到终端设备"; //this.lbl_PC_Node_State.Text = "连接终端在" + PublicVar.g_SCIComNum; PublicVar.g_SCIComNum = SCIPorts[i]; this.btnPnFlashErase.Enabled = true; this.btnPnFlashRead.Enabled = true; this.btnPnFlashReadAddr.Enabled = true; this.btnPnFlashWrite.Enabled = true; //sTemp = retInfo.Substring(retInfo.IndexOf('.') + 1, retInfo.Length - retInfo.IndexOf('.') - 1); //sTemp = retInfo.Substring(retInfo.IndexOf('!') + 2, retInfo.Length - retInfo.IndexOf('!') - 2); sTemp = retInfo.Substring(retInfo.IndexOf('!') + 2, 19); //sTemp = retInfo.Substring(retInfo.IndexOf('.') + 1, retInfo.Length - retInfo.IndexOf('.') - 1); this.lbl_PC_Node_State.Text = SCIPorts[i] + ":" + sTemp; //右上角显示区 //this.lbl_PC_Node_State.Text = sTemp; //右上角显示区 break; //找到后UART_User串口后,跳出循环 } } } } if (i == SCIPorts.Length) { this.tb_statue.Text = "未找到终端设备"; MessageBox.Show("检查UART_User(KL36:UART0)串口有无接好"); this.btnPnFlashErase.Enabled = false; this.btnPnFlashRead.Enabled = false; this.btnPnFlashReadAddr.Enabled = false; this.btnPnFlashWrite.Enabled = false; sci.Close(); } //状态提示 //} //else goto btn_uartcheck_Click_EXIT3; //接收到错误返回 ////(5)退出区 ////(5.1)退出函数 //btn_uartcheck_Click_EXIT: // btnCheckPcNode.Enabled = true; // return; ////(5.2)不存在可用串口 //btn_uartcheck_Click_EXIT1: // btnCheckPcNode.Text = "运行状态:当前不存在可用串口"; //右上角提示区 // this.btnPnFlashErase.Enabled = false; // this.btnPnFlashRead.Enabled = false; // this.btnPnFlashReadAddr.Enabled = false; // this.btnPnFlashWrite.Enabled = false; // goto btn_uartcheck_Click_EXIT; ////(5.3)存在串口,但不存在emuar设备 //btn_uartcheck_Click_EXIT2: // emuart.terminate(115200); //发送数据给终端设备,让终端设备清空其数据缓冲区 // btnCheckPcNode.Text = "重新连接"; //连接按键文本 // lbl_PC_Node_State.Text = "运行状态:已连接串口" + com + "但未找到设备"; //右上角提示区 // this.btnPnFlashErase.Enabled = false; // this.btnPnFlashRead.Enabled = false; // this.btnPnFlashReadAddr.Enabled = false; // this.btnPnFlashWrite.Enabled = false; // goto btn_uartcheck_Click_EXIT; //(5.4)没有正确接收到设备返回消息 //btn_uartcheck_Click_EXIT3: // emuart.terminate(115200); //发送数据给终端设备,让终端设备清空其数据缓冲区 // btnCheckPcNode.Text = "重新连接"; //连接按钮文本 // lbl_PC_Node_State.Text = "找到GEC在" + com + "但握手失败,请再次单击[重新连接]按钮"; //右上角提示区 // this.btnPnFlashErase.Enabled = false; // this.btnPnFlashRead.Enabled = false; // this.btnPnFlashReadAddr.Enabled = false; // this.btnPnFlashWrite.Enabled = false; // goto btn_uartcheck_Click_EXIT; }