//======================================================================
        //函数名称:uartSendRecv
        //函数返回:true:数据帧发送成功并接收到返回值;
        //          false:数据帧发送后未接收到返回值或返回值解析失败
        //参数说明:sendBytes:待发送的数据;cnt:重复发送次数;
        //          time:发送后等待接收返回值的时间
        //功能概要:串口发送数据,并等待接收返回值
        //======================================================================
        private bool uartSendRecv(byte[] sendBytes, int cnt, int time)
        {
            //(1)变量声明
            bool rv;
            bool sendFlag;

            byte[] recvData;  //返回数据

            rv = true;
            //(2)提示发送数据操作
            fmain.lbl_mainstatus.Text = "运行状态:正发送数据至终端...";
            txtShow("\r\n正发送数据至终端,等待返回数据...\r\n");
            //(3)发送数据帧到终端
            uart.recvData();//在发送数据帧之前清空接收缓冲区
            //数据发送并等待指定时间接收返回值
            sendFlag = pcNode.PCNodeSendReturn(sendBytes, out recvData, cnt, time);
            //(4)未接收到数据则更新状态栏
            if (recvData == null || recvData.Length <= 0)
            {
                fmain.lbl_mainstatus.Text = "运行状态:终端无数据返回";
                txtShow("终端无数据返回\r\n");

                //提示失败
                rv = false;
                goto uartSendRecv_EXIT;
            }
            //(5)成功接收数据,提示并进行数据解析
            fmain.lbl_mainstatus.Text = "运行状态:接收到终端数据返回,数据解析中...";
            txtShow("接收到终端数据返回,数据解析中...\r\n");
            //(5.1)终端接收到更新提示,跳转bootloader程序并返回Start Update
            if (System.Text.Encoding.Default.GetString(recvData) == "Start Update")
            {
                fmain.lbl_mainstatus.Text = "运行状态:程序进入bootloader,开始更新";
                txtShow("程序进入bootloader,开始更新\r\n");

                rv = true;
                goto uartSendRecv_EXIT;
            }
            //(5.2)接收到更新返回数据
            else if (update != null && update.updateRecv(recvData) != 0)  //数据解析失败
            {
                fmain.lbl_mainstatus.Text = "运行状态:数据解析失败";
                txtShow("数据解析失败\r\n");

                rv = false;
                goto uartSendRecv_EXIT;
            }
            //(6)至此,数据接收成功
            fmain.lbl_mainstatus.Text = "运行状态:数据解析成功,成功接收到终端返回";
            txtShow("数据解析成功,成功接收到终端返回\r\n");

uartSendRecv_EXIT:
            return(rv);
        }
        //======================================================================
        //函数名称:uartSendRecv
        //函数返回:true:数据帧发送成功并接收到返回值;
        //          false:数据帧发送后未接收到返回值或返回值解析失败
        //参数说明:sendBytes:待发送的数据;cnt:重复发送次数;
        //          time:发送后等待接收返回值的时间
        //功能概要:串口发送数据,并等待接收返回值
        //======================================================================
        private bool uartSendRecv(byte[] sendBytes, int cnt, int time)
        {
            //(1)变量声明
            bool rv;
            bool sendFlag;

            byte[] recvData;  //返回数据

            rv = true;
            //(2)提示发送数据操作
            fmain.lbl_mainstatus.Text = "运行状态:正发送更新数据至终端...";
            txtShow("\r\n正发送更新数据至终端...\r\n");
            //(3)发送数据帧到终端
            uart.recvData();//在发送数据帧之前清空接收缓冲区
            //数据发送并等待指定时间接收返回值
            sendFlag = pcNode.PCNodeSendReturn(sendBytes, out recvData, cnt, time);
            //(4)根据终端返回数据来判断终端执行状态
            //(5.1)终端接收到更新提示,跳转bootloader程序并返回Start Update
            if (System.Text.Encoding.Default.GetString(recvData) == "Start Update")
            {
                fmain.lbl_mainstatus.Text = "运行状态:程序进入bootloader,开始更新";
                txtShow("程序进入bootloader,开始更新\r\n");

                rv = true;
                goto uartSendRecv_EXIT;
            }
            //(5.2)接收到更新返回数据
            else if (update.getSendCount() == update.getFrameNum() - 1)  //数据解析失败
            {
                fmain.lbl_mainstatus.Text = "运行状态:准备发送检查命令,等待接收返回值...";
                txtShow("准备发送检查命令,等待接收返回值...\r\n");
                if (update.updateRecv(recvData) != 0)
                {
                    update.checkClear(update.getFrameNum() - 2);//请检查帧发送标志

                    fmain.lbl_mainstatus.Text = "运行状态:终端数据检查失败,补发丢失数据...";
                    txtShow("终端数据检查失败,补发丢失数据...\r\n");

                    rv = false;
                    goto uartSendRecv_EXIT;
                }
                else
                {
                    fmain.lbl_mainstatus.Text = "运行状态:终端更新数据检查成功";
                    txtShow("终端更新数据检查成功\r\n");
                }
            }
            //(6)至此,数据接收成功
            //fmain.lbl_mainstatus.Text = "运行状态:数据解析成功,成功接收到终端返回";
            //txtShow("数据解析成功,成功接收到终端返回\r\n");

uartSendRecv_EXIT:
            return(rv);
        }
Exemplo n.º 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);
        }