RS232通信端口检测的问题
我做的是一个上位机与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信息:","未知的系统错误");
是不是有哪个函数是专门检测端口打开的?
还请高手指点!!!多谢了!! 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、你并没有针对具体错误进行处理,只是弹出对话框,程序还是有可能出现异常。 请问版主是不是有哪个函数是专门检测端口打开的?
还有检测到端口出现错误,就弹出提示错误原因,并提示重新设置端口函数数值,然后重新设置直到成功打开为止。刚刚你那个我也试了,运行还是会死机。多谢了!!!
[ 本帖最后由 xiaowei86 于 2008-10-21 14:12 编辑 ] 试试下面的代码:
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 编辑 ] 能不能用一个定时器来判断串中状态?
是不是一定要通过OpenCom()、OpenComConfig()的返回值来判定串口的状态?那这样不是每次要判定就必须打开串中?
因为如果在运行中出现串中错误的话,不知道怎么判断它? 1、串口打开后,在使用中一般不会出现连接等硬件错误;
2、可以通过通讯协议用软件方法判定串口通讯是否正确;
3、一定要每次发送都判定串口状态的话,请使用GetComConnectionState (int portNumber)函数! 但是GetComConnectionState (int portNumber)函数只能与NI的串行硬件相连时才能用。因为比如在运行时出现串口问题,很容易出现死机之类的状况。我看到过很多类似的程序,在运行时都是通过定时器来判定串口通信是否正常?用协议判断的话,你也必须先发送一个数据然后根据返回值判定的。请问版主还有没更好的方法? 据我所知,没有其它更好的办法。首先,我在使用串口中,并没有遇到死机的问题(如果容易死机,很大程度上是程序问题!);其次,在串口通讯中使用定时器是一种比较笨拙的方法(可能这话说的有点不中听!),很可能那些频繁的死机正是由于不正确地使用了定时器而造成的。 多谢版主!!!
我听说过用int GetComStat (int Port_Number);可以,但我不知道用它返回值是多少,是否跟OpenComConfig()返回值一样?
还版主请指教!!!
[ 本帖最后由 xiaowei86 于 2008-10-22 10:01 编辑 ] 在CVI的帮助文件中有介绍这个函数反回值的! GetCommStat()返回指定串口的信息,为两个字节的十六进制数,每个位代表不同的状态信息。但是不建议使用它:使用它虽然能够知道串口是否发生错误,但通过返回值却并不能具体知道究竟是什么错误(这可能是NI自己的一个bug吧——窃以为。)。
页:
[1]