SPCOMM的一个简单问题(20分)

  • 主题发起人 主题发起人 carrie4002
  • 开始时间 开始时间
C

carrie4002

Unregistered / Unconfirmed
GUEST, unregistred user!
用SPCOMM实现通讯。
1、想在打开串口之前先判断串口是否已打开,怎么写代码?
2、想在关闭串口之前先判断串口是否已关闭,该怎么写?
 
我看过SPCOMM的源码
SPCOMM在打开串口和关闭串口前都有判断
如果你要自己判断可以调用API
比如声明一个句柄FCommHandle
那么打开
{ 判断串口是否已经打开 }
if FCommHandle > 0 then
ClosePort;
{ 打开COM端口 }
FCommHandle := CreateFile(PChar('//./' + FComPort),
GENERIC_READ or GENERIC_WRITE or FILE_SHARE_READ or FILE_SHARE_WRITE,
0, nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,
0);
{ 如果串口打开失败,退出 }
if FCommHandle = INVALID_HANDLE_VALUE then
Exit;

关闭
if (FCommHandle = 0) or (FCommHandle = INVALID_HANDLE_VALUE) then
Exit;
{ 关闭串口 }
CloseHandle(FCommHandle);
 
有没有邮箱,我发一个更好用的串口组件给你,比SPCOM好用多了.而且经过在实际工程中应用非常好.主要是封装了很多操作.
 
现在为什么还老是用串口啊。多想想usb口吧。。现在都用usb接口通信了,连新笔记本电脑都没串口了
 
dcs_dcs:不能这么说.每个地方用的不一样.串口加上485转换可以达到几公里的距离,USB能吗.而且232>.485可以进行几百个通讯终端的连接.简单可能.USB除了在海量数据及方便上有优势.其它呢?
 
呵呵 谢谢楼上各位。
TO muhx:
也谢谢你。
只是我不懂如何“声明一个句柄FCommHandle”,比如,我的串口为COMMK2000,该怎么写代码?
 
我有一个和二楼一样的,可以探测到计算机上可用的所有串口,当然如果串口已经被打开了,就会探测不到。也就是串口不可用了。不知你要求的是什么功能?还有你的那个串口怎么是COMMK2000,怎么这么怪啊?
 
COMMK2000是串口名字。该如何写句柄的定义及判断?
 
如果直接用spcomm,第一次打开那么
try
Commk200.startcomm;
//doning 正确打开
Except
// 串口被占用
end;

关闭其实无需判断是否已经关闭,因为spcomm关闭前会判断是否已经打开过串口。
如果自己一定要判断,自己加一个变量纪录打开关闭的操作。spcomm也是
如此,它用hCommFile记录,不过是私有变量。也可以自己改为公有变量的
 
问题: 求助:SPCOMM控件怎么判断它的状态? ( 积分: 15 )
分类: 局域网 / 通讯

来自: wei0916, 时间: 2005-07-29 20:41:00, ID: 3150713
求助:SPCOMM控件怎么判断它的状态?在DELPHI里使用它的时候,用MSCOMM控件的时候,有一个很好的参数,就是IF MSCOMM1.PORTOPEN THEN........
而对SPCOMM,就算打开了某个串口,下次再次去调用某个串口的时候,却不知其是否已经打开,如果直接用SPCOMM.COMMNAME="COM1",然后用SPCOMM.STARTCOMM,这样肯定会出错.不知哪位大虾能指教一下怎样能获取SPCOMM的当前状态是否已经打开...

来自: 唐佐平, 时间: 2005-07-29 20:48:28, ID: 3150719
用一个变量记录下它的状态,其他应该没有什么好办法了。

来自: maxim88, 时间: 2005-08-01 14:19:24, ID: 3152741
Try Comm1.StartComm
except
ShowMessage(Comm1.CommName+'不存在或被占用!');
exit;
end;

来自: wei0916, 时间: 2005-08-01 20:18:49, ID: 3153082
如果能利用MSCOMM的PORTOPEN属性就好了,IF MSCOMM1.PORTOPEN THEN
MSCOMM1.PORTOPEN=FALSE
MSCOMM1.COMMPORT=1
MSCOMM1.SETTING='9600,N,8,1'
MSCOMM1.PORTOPEN=TRUE
ELSE
MSCOMM1.COMMPORT=1
MSCOMM1.SETTING='9600,N,8,1'
MSCOMM1.PORTOPEN=TRUE
END IF
在程序运行的过程里可以随时更改COM口的端口号及参数是多么好用呀.可是SPCOMM做不到,不知现在有没有更高级的SPCOMM,哪位大虾提供一下.谢了.

来自: butcool, 时间: 2005-08-09 0:51:45, ID: 3160518
用COMBOBOX做个选择串口的东西,内容为"COM1""COM2""COM3"......
form1.comm1.PortName:='//./'+form1.ComboBox1.Text;
if not comm1.connect then begin
..............................
此处就可以设置其它参数了比如
comm1.BaudRateValue:=19200;其他参数的修改最好看明白该控件的属性

end;

这样就可以知道是否使用了该串口,并能重新设置该串口

来自: chenybin, 时间: 2005-08-09 9:48:31, ID: 3160726
Spcomm的StartComm方法里面抛出了几个异常,其中有一个就是串口占用的,你可以把StartComm修改成一个函数,返回Integer,判断就可以了

来自: wei0916, 时间: 2005-08-10 10:06:13, ID: 3161953
修改函数后要在错误捕获里捕获SPCOMM的异常,再跟据异常看串口是否打开对吗

来自: 大痴, 时间: 2005-08-23 21:48:31, ID: 3177731
你可以先comm1.stopcomm再comm1.startcomm了,打开之前先关闭就好了。

来自: h6003113, 时间: 2005-08-23 22:17:12, ID: 3177775
try
except
再打开串口一次,就可以了!!

来自: chenybin, 时间: 2005-08-23 22:26:17, ID: 3177781
其实不修改也可以,系统自己会抛出异常的,修改起来也不麻烦阿

来自: AsleepAnge, 时间: 2005-08-25 10:25:17, ID: 3179642
直接用START就可以了,办法虽然笨蛋,但只要知道准确的端口数,然后用TRY COMM1.start 打开后的操作,except 打不开的错误提示。。。

来自: wei0916, 时间: 2005-09-03 9:03:12, ID: 3190153
多人接受答案了。

得分大富翁: AsleepAnge-2,butcool-2,chenybin-2,h6003113-2,maxim88-2,大痴-2,唐佐平-3,
 
谢谢各位。
 
后退
顶部