//======================================================================
        //函数名称:rdo_uart_CheckedChanged
        //函数返回:无
        //参数说明:无
        //功能概要:点击“串口更新”单选按钮,显示串口更新页面并使用串口方式连接终端
        //======================================================================
        private void rdo_uart_CheckedChanged(object sender, EventArgs e)
        {
            //(1)变量申明
            string com;

            //(2)若串口更新未选中,直接退出
            if (this.rdo_uart.Checked == false)
            {
                return;
            }

            //(3)串口更新页面显现
            this.pnl_uart.Visible     = true;
            fmain.lbl_mainstatus.Text = "运行状态:选择串口更新";
            //(4)寻找并连接终端
            if (uart != null && uart.IsOpen)
            {
                uart.close();
            }
            pcNode = new PCNode();//pc节点初始化
            com    = pcNode.findPCNode();
            uart   = pcNode.PCNode_Uart;
            this.lbl_uartstate.Text = com;
            //(5)绑定DataReceived事件(即串口接收中断处理函数)
            if (uart != null)
            {
                //(5.1)连接串口成功
                uartPort = uart.port;
                uartPort.DataReceived -= new System.IO.Ports.SerialDataReceivedEventHandler(this.uartPort_recvData); //先移除委托函数,防止多次触发
                uartPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.uartPort_recvData);
                uart.setReceInt(500);                                                                                //相当于关闭串口中断

                this.btn_autoUpdate.Enabled = true;                                                                  //允许串口更新操作
                //修改主页面提示信息
                this.lbl_uartstate.Text     = "成功连接" + com;
                fmain.lbl_mainstatus.Text   = "运行状态:找到" + com;
                fmain.lbl_protocal.Text     = "协议:串口";
                fmain.lbl_protocalinfo.Text = "协议信息:端口" + com + ",波特率115200";
            }
            else
            {
                //(5.2)连接串口失败
                this.btn_autoUpdate.Enabled = false;  //禁止串口更新操作
                //修改主页面提示信息
                fmain.lbl_mainstatus.Text   = "运行状态:未成功连接终端," + com;
                fmain.lbl_protocal.Text     = "协议:";
                fmain.lbl_protocalinfo.Text = "协议信息:";
            }
        }
        //======================================================================
        //函数名称:btn_uartCheck_Click
        //函数返回:无
        //参数说明:无
        //功能概要:“重新连接”按钮点击事件,重新连接终端
        //======================================================================
        private void btn_uartCheck_Click(object sender, EventArgs e)
        {
            //(1)变量申明
            string com;

            //(2)提示重新连接串口
            fmain.lbl_mainstatus.Text = "运行状态:单击“重新连接”按钮...";
            //(3)重新遍历串口,寻找终端
            if (uart != null && uart.IsOpen)
            {
                uart.close();
            }
            pcNode = new PCNode();//pc节点初始化
            com    = pcNode.findPCNode();
            uart   = pcNode.PCNode_Uart;
            this.lbl_uartstate.Text = com;
            //(4)绑定DataReceived事件(即串口接收中断处理函数)
            if (uart != null)
            {
                //(4.1)连接串口成功
                uartPort = uart.port;
                uartPort.DataReceived -= new System.IO.Ports.SerialDataReceivedEventHandler(this.uartPort_recvData); //先移除委托函数,防止多次触发
                uartPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.uartPort_recvData);
                uart.setReceInt(500);                                                                                //相当于关闭串口中断

                this.btn_autoUpdate.Enabled = true;                                                                  //允许串口更新操作
                //修改主页面提示信息
                this.lbl_uartstate.Text     = "成功连接" + com;
                fmain.lbl_mainstatus.Text   = "运行状态:找到" + com;
                fmain.lbl_protocal.Text     = "协议:串口";
                fmain.lbl_protocalinfo.Text = "协议信息:端口" + com + ",波特率115200";
            }
            else
            {
                //(4.2)连接串口失败
                this.btn_autoUpdate.Enabled = false;  //禁止串口更新操作
                //修改主页面提示信息
                fmain.lbl_mainstatus.Text   = "运行状态:未成功找到串口," + com;
                fmain.lbl_protocal.Text     = "协议:";
                fmain.lbl_protocalinfo.Text = "协议信息:";
            }
        }
Exemple #3
0
        //======================================================================
        //函数名称:sendRecv
        //函数返回:true:数据帧发送成功并接收到返回值;
        //          false:数据帧发送后未接收到返回值或返回值解析失败
        //参数说明:sendBytes:待发送的数据;cnt:重复发送次数;
        //          time:发送后等待接收返回值的时间
        //功能概要:串口发送数据,并等待接收返回值
        //======================================================================
        private bool sendRecv(byte[] sendBytes, int cnt, int time)
        {
            //(1)变量声明
            byte[] recvData;
            bool   rv;
            bool   sendFlag;
            string com;

            rv = true;
            //(2)更新状态栏,显示当前操作
            txtShow("\r\n正在发送...\r\n");
            //(3)发送数据帧到下位机
            uart.recvData();//在发送数据帧之前清空接收缓冲区
            sendFlag = pcNode.PCNodeSendReturn(sendBytes, out recvData, cnt, time);
            //(4)若发送失败,尝试自动重连一次,并且重发
            if (sendFlag == false)
            {
                fmain.lbl_status.Text = "运行状态:数据发送失败,重新连接终端并重发...";
                txtShow("数据发送失败,重新连接终端并重发...\r\n");
                //重连串口
                if (uart != null && uart.IsOpen)
                {
                    uart.close();
                }
                com  = pcNode.findPCNode();
                uart = pcNode.PCNode_Uart;
                fmain.lbl_status.Text = "运行状态:找到" + com;
                lbl_uart_state.Text   = com;
                //重新发送数据
                sendFlag = pcNode.PCNodeSendReturn(sendBytes, out recvData, cnt, time);
            }
            //(5)未接收到数据则更新状态栏
            if (recvData == null || recvData.Length <= 0)
            {
                fmain.lbl_status.Text = "运行状态:无数据返回";
                txtShow("无数据返回\r\n");

                rv = false;
                goto sendRecv_EXIT;
            }
            //(6)成功接收数据,提示并进行数据解析
            txtShow("有数据返回,数据解析中...\r\n");

            if (System.Text.Encoding.Default.GetString(recvData) == "Start Update")
            {
                fmain.lbl_status.Text = "运行状态:程序进入bootloader,开始更新";
                txtShow("程序进入bootloader,开始更新\r\n");

                rv = true;
                goto sendRecv_EXIT;
            }
            else if (update != null && update.updateRecv(recvData) != 0)  //数据解析失败
            {
                fmain.lbl_status.Text = "运行状态:数据解析失败";
                txtShow("数据解析失败\r\n");

                rv = false;
                goto sendRecv_EXIT;
            }
            //(7)至此,数据接收成功
            fmain.lbl_status.Text = "运行状态:数据解析成功,准备下一帧";
            txtShow("数据解析成功,准备下一帧\r\n");

sendRecv_EXIT:
            return(rv);
        }
        /// ------------------------------------------------------------------------------
        /// <summary>
        /// 功    能:寻找PCNode。
        /// 形    参:无
        /// <returns>无</returns>
        /// -----------------------------------------------------------------------------
        public string findPCNode()
        {
            int    i, j;
            string s1;
            string recvstr;

            int[] uartNoArray;   //
            System.IO.Ports.SerialPort uartport;
            //1.临时变量

            bool result = false;     //

            byte[] recvData = null;  //串口接收返回的信息


            byte[] shakeframe = { (byte)'s', (byte)'h', (byte)'a', (byte)'k', (byte)'e' };

            byte[] frame = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

            //初始化内部调用函数临时变量
            s1 = string.Empty;    //初始化临时字符串(置空)

            //创建_port1对象
            uartport = new System.IO.Ports.SerialPort();
            //查询所有串口,串口数在uartNoArray[0]中

            uartNoArray = Uart.findCOM();
            //没有找到串口情况
            if (uartNoArray[0] == 0)
            {
                return(s1 = "没有找到USB串口");
            }

            //有找到串口情况,遍历搜寻串口
            for (i = uartNoArray[0]; i >= 1; i--)
            {
                string comName = "COM" + uartNoArray[i].ToString(); //串口名称
                uart1 = new Uart(uartport, comName, 115200);        //初始化串口工具类
                //2.打开串口
                result = uart1.open();
                if (!result)
                {
                    continue;
                }
                uart1.setReceInt(200);                                  //设置触发DataRecieved事件的字节数(目的是关闭该事件)
                uart1.sendData(frame, frame.Length);                    //预发送数据,防止下位机组帧出错
                System.Threading.Thread.Sleep(100);                     //线程休眠0.1s
                result = uart1.sendData(shakeframe, shakeframe.Length); //发送握手数据
                if (!result)
                {
                    uart1.close(); continue;
                }
                System.Threading.Thread.Sleep(100);   //线程休眠0.1s
                recvData = uart1.recvData();          //接收数据

                //if (recvData == null || recvData.Length == 0)
                //   { uart1.close(); continue; }

                //将握手成功,数组转换成字符串,返回
                recvstr = System.Text.Encoding.Default.GetString(recvData);
                if (!recvstr.Contains("shake:"))
                {
                    uart1.close(); continue;
                }
                j  = recvstr.IndexOf(":");
                s1 = recvstr.Substring(j + 1, recvstr.Length - j - 1);
                //s1 = comName;
                break;
            }
            if (i == 0)
            {
                s1    = "有USB串口,但未连上终端";
                uart1 = null;
            }

            return(s1);
        }
 /// ------------------------------------------------------------------------------
 /// <summary>
 /// 名    称:(0)Find_PC_Node:构造函数
 /// 功    能: 创建KW01寻节点实例
 /// 内部参数: uart1:  串口工具类
 /// </summary>
 /// <param name="uart1">串口工具类</param>
 /// <returns>true_串口初始化成功 false_初始化失败</returns>
 /// ------------------------------------------------------------------------------
 public PCNode()
 {
     uart1 = null;
 }