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(), "警告");
}

}

...全文
2687 13 打赏 收藏 转发到动态 举报
写回复
用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(); ……
书名:《Visual C#.NET串口通信及测控应用典型实例》(电子工业出版社.李江全.邓红涛.刘巧.李伟) PDF格式扫描版,全书分为8章,共369页。2012年5月出版。 全书压缩打包成3部分,这是第3部分 内容简介 本书从工程应用的角度出发,通过8个典型应用实例,包括PC与PC、PC与单片机、PC与PLC、PC与远程I/O模块、PC与智能仪器、PC与无线数传模块、Pc与USB数据采集模块等组成的测控系统,利用SerialPort控件和MSComm控件编写C#.NET串口通信程序,并对计算机测控系统中的4类典型应用((模拟量输入(AI)、模拟量输出(AO)、数字量输入(DI)和数字量输出(DO)的程序设计方法进行了详细的讲解。 目 录 第1章 PC与PC串口通信 1.1 串口通信概述 1.1.1 串口通信的基本概念 1.1.2 RS-232C接口标准 1.1.3 RS-422/485接口标准 1.1.4 串口通信线路连接 1.1.5 PC中的串行端口 1.1.6 虚拟串口的使用 1.2 VC++.NET串行通信控件与API函数 1.2.1 MSComm控件的使用 1.2.2 SerialPort控件的使用 1.2.3 串行通信API函数 1.3 PC与PC串口通信实例 1.3.1 两台PC串口通信 1.3.2 一台PC双串口互通信 第2章 PC与单片机串口通信 2.1 典型单片机开发板简介 2.1.1 单片机测控系统的组成 2.1.2 单片机开发板B的功能 2.1.3 单片机开发板B的主要电路 2.2 PC与单片机串口通信实例 2.2.1 PC与单个单片机串口通信 2.2.2 PC与多个单片机串口通信 2.3 PC与单片机串口通信测控应用实例 2.3.1 模拟量输入 2.3.2 模拟量输出 2.3.3 开关量输入 2.3.4 开关量输出 第3章 PC与西门子PLC串口通信 3.1 西门子PLC模拟量扩展模块与通信协议 3.1.1 西门子PLC模拟量输入模块 3.1.2 西门子PLC PPI通信协议 3.2 PC与西门子PLC串口通信测控应用实例 3.2.1 模拟量输入 3.2.2 模拟量输出 3.2.3 开关量输入 3.2.4 开关量输出 第4章 PC与三菱PLC串口通信 4.1 三菱PLC特殊功能模块与通信协议 4.1.1 FX2N系列PLC的特殊功能模块 4.1.2 三菱PLC编程口通信协议 4.2 PC与三菱PLC串口通信测控应用实例 4.2.1 模拟量输入 4.2.2 模拟量输出 4.2.3 开关量输入 4.2.4 开关量输出 第5章 PC与分布式I/O模块串口通信 5.1 典型分布式I/O模块简介 5.1.1 集散控制系统的结构与特点 5.1.2 ADAM4000远程数据采集控制系统 5.1.3 ADAM4000系列模块简介 5.1.4 ADAM4000系列模块的软件安装 5.2 PC与分布式I/O模块串口通信测控应用实例 5.2.1 模拟量输入 5.2.2 模拟量输出 5.2.3 数字量输入 5.2.4 数字量输出 第6章 PC与智能仪器串口通信 6.1 典型智能仪器简介 6.1.1 智能仪器的结构与特点 6.1.2 XMT-3000A型智能仪器的通信协议 6.2 PC与智能仪器串口通信测控应用实例 6.2.1 PC与单台智能仪器温度测控 6.2.2 PC与多台智能仪器温度测控 第7章 PC与无线数据传输模块串口通信 7.1 典型无线数传模块简介 7.1.1 无线数传技术概述 7.1.2 DTD46X系列无线数传模块 7.2 PC与无线数传模块串口通信测控应用实例 7.2.1 设计任务 7.2.2 线路连接 7.2.3 利用C51语言实现基于DS18B20的单片机温度测控 7.2.4 利用汇编语言实现基于DS18B20的单片机温度测控 7.2.5 利用VC++.NET实现PC与无线数传模块温度测控 第8章 USB串行总线模块测控应用 8.1 USB总线在数据采集系统中的应用 8.1.1 USB总线及其数据采集系统的特点 8.1.2 采用USB传输的数据采集系统 8.1.3 典型USB数据采集模块及应用 8.1.4 VC++.NET数据采集与控制的方式 8.2 PC与USB数据采集模块测控应用实例 8.2.1 模拟量输入 8.2.2 模拟量输出 8.2.3 数字量输入 8.2.4 数字量输出 参考文献

110,567

社区成员

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

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

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