首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C# 清理串口返回数据缓冲区数据有关问题(急)

2013-04-02 
C# 清理串口返回数据缓冲区数据问题(急!)本帖最后由 z525416460 于 2013-01-25 16:56:56 编辑[size14px]M

C# 清理串口返回数据缓冲区数据问题(急!)
本帖最后由 z525416460 于 2013-01-25 16:56:56 编辑 [size=14px]MainForm.cs
  private void SendCommand(string ls_CmdType,string ls_CmdTypeStr,int i)
        {
            DataTable dt = null;
            string terstr = null;//临时数据表存储“H_Termina”
            string ls_teradds = null;//变量TerAdds
            string ls_str = null;//组合参数
            //string ls_wk = null;//临时TerminalID
            string ls_TerRemark = null;//该设备所属com口
            try
            {
            if (ltvEmp.Items.Count > 0)
            {
               
                if (i == -1)
                {
                    terstr = ltvEmp.SelectedItems[0].SubItems[1].Text;
                    
                }
                else
                {
                    terstr = ltvEmp.Items[i].SubItems[1].Text;
                }
                    isml = terstr;
                    Reclb = 1;
                    dt = dbr.getTable("select TerAdds,TerRemark from H_Termina where TerminalID = '" + isml + "'");
                    ls_teradds = dt.Rows[0][0].ToString();
                    ls_TerRemark = dt.Rows[0][1].ToString();
                    //ls_str = "I" + ls_teradds.Substring(ls_teradds.Length - 4, 4);
                    switch (ls_CmdType)//如果是开阀就按此格式添加
                    {


                        case "K"://开/关阀
                            ls_str = "I" + ls_teradds.Substring(ls_teradds.Length - 4, 4)
                            + ls_TerRemark
                            + isml.Substring(isml.Length - 2, 2)
                            + ls_CmdType
                            + ls_CmdTypeStr;
                            break;
                        case "J"://允许巡逻
                            ls_str = "I" + ls_teradds.Substring(ls_teradds.Length - 4, 4)
                            + "000"
                            + ls_CmdType;
                            break;
                        case "C"://禁止巡逻
                            ls_str = "I" + ls_teradds.Substring(ls_teradds.Length - 4, 4)
                            + "000"
                            + ls_CmdType;
                            break;
                        case "V"://检查温度
                            ls_str = "L" + ls_teradds.Substring(ls_teradds.Length - 4, 4)
                            + ls_TerRemark
                            + isml.Substring(isml.Length - 2, 2)


                            + ls_CmdType;                         
                            break;
                        case "T"://检查时间
                            ls_str = "L" + ls_teradds.Substring(ls_teradds.Length - 4, 4)
                            + ls_TerRemark
                            + isml.Substring(isml.Length - 2, 2)
                            + "&8013";                          
                            //MessageBox.Show(ls_str);
                            break;
                        case "M"://置模式
                            ls_str = "I" + ls_teradds.Substring(ls_teradds.Length - 4, 4)
                            + ls_TerRemark
                            + isml.Substring(isml.Length - 2, 2)
                            + ls_CmdType
                            + ls_CmdTypeStr;
                            break;
                        case "H"://搜索汇接器指令1
                            ls_str = "I0000000J";
                            break;


                        case "H2"://搜索汇接器指令2
                            ls_str = "L0000000X";
                            break;
                        default:
                            ls_str = "0027";
                            break;
                    }

                    string model = protocol.Getinstance(ls_str)._Model;
                    if (!spPort.IsOpen)
                    {
                        OpenComm();
                    }
                    spPort.Write(model);//将指令写入串口缓冲区
                    #region 
                  
                    #endregion

                    //System.Threading.Thread.Sleep(500);
                  
                    dt.Clear();
                    dt.Dispose();
                    spPort.DiscardInBuffer();//清理输入缓冲区
                    spPort.DiscardOutBuffer();//清理输出缓冲区


                    
                //}
                
             }
            }
            catch (System.Exception e)
            {


                MessageBox.Show(e.ToString(), "警告");
            }

        }
 void spPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {           
            int bytes = spPort.BytesToRead;
            // 创建字节数组
            byte[] buffer = new byte[bytes];
            // 读取缓冲区的数据到数组
            spPort.Read(buffer, 0, bytes);
            string data = Encoding.ASCII.GetString(buffer);//ByteArrayToHexString(buffer);
            isstr += data;
            isstr = isstr.Replace(" ", "");           
           
        }
  private void tsmHotTime_Click(object sender, EventArgs e)
        {
                       
            UpdateT();
           
        }
       private void UpdateT()
       {
               UserInfo _userinfo = UserInfo.ReturnUserInfo();              
               if (ltvEmp.Items.Count > 0)
               {
                   for (int i = 0; i < this.ltvEmp.Items.Count; i++)
                   {
                       
                       SendCommand("T", "", i);
                       if (isstr != "")
                       {                                       
                           if (_userinfo.SetUserT(isstr, ltvEmp.Items[i].SubItems[1].Text))


                           {
                               //MessageBox.Show("更新成功", "提示");
                               //isstr = "";
                           }
                           BinAll();
                           
                       }
                       else
                       {

                       }
                   }
               }
          
       }
 private void UpdateV()
        {
             UserInfo _userinfo = UserInfo.ReturnUserInfo();
            if (ltvEmp.Items.Count > 0)
            {
                for (int i = 0; i < this.ltvEmp.Items.Count;i++ )
                {
                    SendCommand("V", "",i);
                    if (isstr != "")
                    {                        
                       
                        if (_userinfo.SetUserV(isstr, ltvEmp.Items[i].SubItems[1].Text)) 
                        {
                            //MessageBox.Show("更新成功", "提示");


                            //isstr = "";
                        }
                        BinAll();
                    }
                    else
                    {
                        //MessageBox.Show("返回数据出错", "提示");
                    }
                }

           
            }
            
        }

        private void 实测温度ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            UpdateV();          
          
        }
protocol.cs
 internal void SetUserT(string str_time)
        {
            
            str_time = MainFrom.isstr;
            if (str_time.Length >= 80)
            {
                UserT = str_time.Substring(58, 4).ToString() + "."
                       + str_time.Substring(62, 2).ToString();
            }
            else
            {
                UserT = str_time.Substring(str_time.Length - 23, 4).ToString() + "."
                        + str_time.Substring(str_time.Length - 19, 2).ToString();
            }
          
        }
        internal bool SetUserT(string ls_T, string ls_terminalid)
        {


            //lock(this)
            //{
               
                bool is_implement = false;
                SetUserT(ls_T);
                //double ls_hottime = 0.0;
                //string ls_sql = "select HotTime,TerState from H_Termina where TerminalID = '"                   + ls_terminalid + "'";
                //ls_dt = dbr.getTable(ls_sql);

                string ls_updateHotTime = "update H_Termina set HotTime = '" + UserT + "'where TerminalID = '" + ls_terminalid + "' ";
                
                try
                {
                    if (dbr.mySqlExecute(ls_updateHotTime))
                    {
                        is_implement = true;
                    }
                }
                catch (System.Exception e)
                {

                }
                return is_implement;
             //}
        }

        internal void SetUserV(string str_temperature)
        {       
               str_temperature = MainFrom.isstr;
                UserV =str_temperature.Substring(str_temperature.Length - 7, 2).ToString()+"."
                    +str_temperature.Substring(str_temperature.Length-5,2).ToString();
        }     
        internal bool SetUserV(string ls_v,string ls_terminalID)


        {
            bool is_implement = false;
            SetUserV(ls_v);
            string ls_updateTemperature = "update H_Termina set TerTPC = '" + UserV + "' where TerminalID='" + ls_terminalID + "'";
            try
            {
                if (dbr.mySqlExecute(ls_updateTemperature))
                {
                    is_implement = true;
                }
            }
            catch (System.Exception e)
            {

            }
            return is_implement;
        }
当我触发UpdateT(更新时间),再触发UpdateV(温度),我单步执行看到串口返回的数据量很大,无法正确解析返回数据,如何能使执行一次命令后,解析完成后清空缓冲区数据,我不知道在哪里添加sport.spPort.DiscardOutBuffer();请大家给看看,指导一下[/size]

热点排行