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]