C# 串口通信问题(提示:端口被关闭)

一条路坚持下去 2013-01-06 09:19:02
string ls = null;
/// <summary>
/// 根据开阀度数打开阀门
/// </summary>
/// <param name="ls_CmdType">指令类型</param>
/// <returns></returns>
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();
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
+ "FF"
+ ls_CmdType;
break;
case "T"://检查时间
ls_str = "L" + ls_teradds.Substring(ls_teradds.Length - 4, 4)
+ ls_TerRemark
+ "FF"

+ ls_CmdType;
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 = null;
break;
}

string model = protocol.Getinstance(ls_str)._Model;

756行 spPort.Write(model);//将指令写入串口缓冲区
dt.Clear();
dt.Dispose();

spPort.DiscardOutBuffer();//清理输出缓冲区
spPort.DiscardInBuffer();//清理输入缓冲区


//new protocol().Dispose();//释放类资源
//}

}
}
catch (System.Exception e)
{
MessageBox.Show(e.ToString(), "警告");
}

}

...全文
3305 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
warren_cao 2015-03-10
  • 打赏
  • 举报
回复
楼主解决没有?我遇到同样的问题了
pfworld 2013-01-06
  • 打赏
  • 举报
回复
if (spPort.IsOpen) { spPort.DataReceived -= new System.IO.Ports.SerialDataReceivedEventHandler(spPort_DataReceived); spPort.Close(); MessageBox.Show("please Connect"); this.Close(); } else { ---- } 这里有问题,应该是: if (!spPort.IsOpen) { ---- } 判断错了,应该是打开就继续,没有打开重新打开(或者退出返回)!
  • 打赏
  • 举报
回复
高人来给看看啊
  • 打赏
  • 举报
回复
上面那个截图错了,是这个错误
  • 打赏
  • 举报
回复
引用 3 楼 zhpfaff 的回复:
在 spPort.Write(model);前加上如下代码,检查一下端口是否打开

if (!spPort.IsOpen)
{
OpenComm();
}

但是出现这样的错误
zhpfaff 2013-01-06
  • 打赏
  • 举报
回复 1
在 spPort.Write(model);前加上如下代码,检查一下端口是否打开 if (!spPort.IsOpen) { OpenComm(); }
快溜 2013-01-06
  • 打赏
  • 举报
回复
调试一下看看写入前spPort的端口状态,提示你写入时端口已经关了。
  • 打赏
  • 举报
回复
void OpenComm() { if (spPort.IsOpen) { spPort.DataReceived -= new System.IO.Ports.SerialDataReceivedEventHandler(spPort_DataReceived); spPort.Close(); MessageBox.Show("please Connect"); this.Close(); } else { spPort.PortName = ClassPub.CommCOM; spPort.BaudRate = 2400; try { spPort.Open(); spPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(spPort_DataReceived); if (spPort.IsOpen) { MessageBox.Show(" 连接设备成功 !"); } } catch (Exception ex) { if (MessageBox.Show(" 连接设备失败或重复连接设备,是否退出重新登录 ", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.None, MessageBoxDefaultButton.Button1) == DialogResult.OK) { spPort.Close(); } } } } 这是定义串口的代码,是不是我不连接设备就提示:端口被关闭的错误,请指教
  • 打赏
  • 举报
回复
高手在哪????
  • 打赏
  • 举报
回复
难道是字符串为空?
  • 打赏
  • 举报
回复
引用 9 楼 yinghuigu 的回复:
ls_str=null了
什么意思
yinghuigu 2013-01-06
  • 打赏
  • 举报
回复
ls_str=null了
  • 打赏
  • 举报
回复
void OpenComm() { if (spPort.IsOpen) { spPort.DataReceived -= new System.IO.Ports.SerialDataReceivedEventHandler(spPort_DataReceived); spPort.Close(); MessageBox.Show("please Connect"); this.Close(); } else { spPort.PortName = ClassPub.CommCOM; spPort.BaudRate = 9600; try { spPort.Open(); spPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(spPort_DataReceived); if (spPort.IsOpen) { MessageBox.Show(" 连接设备成功 !"); } } catch (Exception ex) { if (MessageBox.Show(" 连接设备失败或重复连接设备,是否退出重新登录 ", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.None, MessageBoxDefaultButton.Button1) == DialogResult.OK) { spPort.Close(); } } } } 以及下面的 if (!spPort.IsOpen) { ---- } 如何改才能解决
引用 7 楼 pfworld 的回复:
if (spPort.IsOpen) { spPort.DataReceived -= new System.IO.Ports.SerialDataReceivedEventHandler(spPort_DataReceived); spPort.Close(); ……

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧