cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 2072|回复: 10

RS232通信端口检测的问题

[复制链接]
发表于 2008-10-21 11:30:57 | 显示全部楼层 |阅读模式
我做的是一个上位机与PLC(RS232)通信的问题,现在是想在毎向PLC发送一个数据要检测端口是否打开,如果没打开就重新打开;在打开端口时,如果端口选择不对,弹出对话框,提示错误。但是我写了以下程序,只要端口不对,马上死机,请帮我看看是哪里错了:
if (RS232Error = OpenComConfig (comport, com, baudrate, parity,databits, stopbits, inputq, outputq)==0)
MessagePopup("RS232信息:","端口打开成功");
if (RS232Error==-1)
MessagePopup("RS232信息:","未知的系统错误");
if (RS232Error==-2)
MessagePopup("RS232信息:","端口号无效");
if (RS232Error==-3)
MessagePopup("RS232信息:","端口无法打开");
if (RS232Error==-4)
MessagePopup("RS232信息:","未知的I/O错误");
if (RS232Error==-6)
MessagePopup("RS232信息:","没有发现串行端口");
if (RS232Error==-7)
MessagePopup("RS232信息:","无法打开端口");
if (RS232Error==-1)
MessagePopup("RS232信息:","未知的系统错误");



是不是有哪个函数是专门检测端口打开的?
还请高手指点!!!多谢了!!
发表于 2008-10-21 11:53:53 | 显示全部楼层
1、if (RS232Error = OpenComConfig (comport, com, baudrate, parity,databits, stopbits, inputq, outputq)==0)中的“==”的优先级比“=”高,此句逻辑错误!但语法无错,故编译器不会报错!!!但会产生运行时错误。应改为:if ((RS232Error = OpenComConfig (comport, com, baudrate, parity,databits, stopbits, inputq, outputq))==0);
2、你并没有针对具体错误进行处理,只是弹出对话框,程序还是有可能出现异常。
 楼主| 发表于 2008-10-21 13:43:26 | 显示全部楼层
请问版主是不是有哪个函数是专门检测端口打开的?
还有检测到端口出现错误,就弹出提示错误原因,并提示重新设置端口函数数值,然后重新设置直到成功打开为止。刚刚你那个我也试了,运行还是会死机。多谢了!!!

[ 本帖最后由 xiaowei86 于 2008-10-21 14:12 编辑 ]
发表于 2008-10-21 14:40:36 | 显示全部楼层
试试下面的代码:

DisableBreakOnLibraryErrors();

RS232Error =OpenComConfig (comport, "", baudrate, parity,databits, stopbits, inputq, outputq);

EnableBreakOnLibraryErrors();

if(RS232Error ==0)
{
//......
}
if(RS232Error ==-1)
{
//......
}
另外,CVI中就是通过OpenCom()、OpenComConfig()的返回值来判定串口的状态!

[ 本帖最后由 netcreature 于 2008-10-21 14:44 编辑 ]
 楼主| 发表于 2008-10-21 16:12:43 | 显示全部楼层
能不能用一个定时器来判断串中状态?
是不是一定要通过OpenCom()、OpenComConfig()的返回值来判定串口的状态?那这样不是每次要判定就必须打开串中?
因为如果在运行中出现串中错误的话,不知道怎么判断它?
发表于 2008-10-21 16:46:31 | 显示全部楼层
1、串口打开后,在使用中一般不会出现连接等硬件错误;
2、可以通过通讯协议用软件方法判定串口通讯是否正确;
3、一定要每次发送都判定串口状态的话,请使用GetComConnectionState (int portNumber)函数!
 楼主| 发表于 2008-10-21 17:10:28 | 显示全部楼层
但是GetComConnectionState (int portNumber)函数只能与NI的串行硬件相连时才能用。因为比如在运行时出现串口问题,很容易出现死机之类的状况。我看到过很多类似的程序,在运行时都是通过定时器来判定串口通信是否正常?用协议判断的话,你也必须先发送一个数据然后根据返回值判定的。请问版主还有没更好的方法?
发表于 2008-10-21 17:21:33 | 显示全部楼层
据我所知,没有其它更好的办法。首先,我在使用串口中,并没有遇到死机的问题(如果容易死机,很大程度上是程序问题!);其次,在串口通讯中使用定时器是一种比较笨拙的方法(可能这话说的有点不中听!),很可能那些频繁的死机正是由于不正确地使用了定时器而造成的。
 楼主| 发表于 2008-10-22 08:08:24 | 显示全部楼层
多谢版主!!!
我听说过用int GetComStat (int Port_Number);可以,但我不知道用它返回值是多少,是否跟OpenComConfig()返回值一样?
还版主请指教!!!

[ 本帖最后由 xiaowei86 于 2008-10-22 10:01 编辑 ]
发表于 2008-10-26 17:29:52 | 显示全部楼层
在CVI的帮助文件中有介绍这个函数反回值的!
发表于 2008-10-27 10:57:03 | 显示全部楼层
GetCommStat()返回指定串口的信息,为两个字节的十六进制数,每个位代表不同的状态信息。但是不建议使用它:使用它虽然能够知道串口是否发生错误,但通过返回值却并不能具体知道究竟是什么错误(这可能是NI自己的一个bug吧——窃以为。)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-4-21 19:25 , Processed in 0.573282 second(s), 6 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表