关于SPCOMM问题!

nokir 2004-09-21 01:32:18
某台机子中有多个com接口,我现在要利用SPCOMM控件来进行串口通信!现在我的问题是:
我首先要知道的是,这机子共有几个端口,同时要在空闲的端口中随便选定一个作为我自己的通信端口,该怎么样实现,谁有例子吗?请教我!
...全文
243 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
nokir 2004-09-23
  • 打赏
  • 举报
回复
已经解决!谢谢接分吧!
nokir 2004-09-22
  • 打赏
  • 举报
回复
这也是一个办法,还顺便问一下咯!
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
s:string;
begin
move(Buffer^,pchar(s),BufferLength);
这个代码到底是那里有错误啊!我怎么编译不能通过啊!
错误是这样的!
[Error] Unit1.pas(202): Constant object cannot be passed as var parameter
mjun007 2004-09-22
  • 打赏
  • 举报
回复
你可以这样测一下,变成spcomm代码
for j:=1 to 10 do //找系统端口
begin
comm1.CommName:='com'+inttostr(j);
try
comm1.StartComm;
//标记本端口可用
memo1.Lines.Add('串口'+inttostr(j)+'可用');
comm1.StopComm;
except
//标记本端口不可用
memo1.Lines.Add('串口'+inttostr(j)+'不可用');
end;
end;
next
nokir 2004-09-22
  • 打赏
  • 举报
回复
还有啊!现在还不是有那种USB-232的转换线买吗》。所以你根本就不知道他到底有多少端口啊!
也不知道他的名字咯!我的意思是这样的要是能够象MSCOMM一样可以估计大概最多有几个端口,然后一个一个的测试啊。如
for j:=1 to 10 do //找系统端口
begin
MSComm1.CommPort:=j;
nokir 2004-09-22
  • 打赏
  • 举报
回复
mjun007(慧通特工) 还在吗?
昨天下班了,没有来得及回复,你给我代码看看吧!发到我的邮箱:gongz_1023@163.com
mjun007 2004-09-22
  • 打赏
  • 举报
回复
"Constant object cannot be passed as var parameter" 你又没定义了几个常量,名称和那些参数同名,提示的意思好像是常数对象不能作为函数的一个参数。
mjun007 2004-09-22
  • 打赏
  • 举报
回复
你的delphi版本是多少,我的是delphi7.0,调试运行没问题呀
nokir 2004-09-22
  • 打赏
  • 举报
回复
程序收到了!但是[Error] Unit1.pas(202): Constant object cannot be passed as var parameter
还是存在啊!谢谢!
mjun007 2004-09-22
  • 打赏
  • 举报
回复
我的程序给你发过去了,还没受到吗?
mjun007 2004-09-22
  • 打赏
  • 举报
回复
先设置s长度试试:
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
s:string;
begin
setlength(s,bufferlength);
move(Buffer^,pchar(s),BufferLength);
.....
mjun007 2004-09-21
  • 打赏
  • 举报
回复
“要动态的改变他的名字”,当然在代码里改那个CommName属性就可以了,最好加上TRY,EXCEPT,FINALLY 异常处理语句,如果出错,可根据返回错误提示,弹出对话框,再让用户选择其它串口,或说明串口以占用。
mjun007 2004-09-21
  • 打赏
  • 举报
回复
一般机子上都有COM1,如果是俩个串口的话那就是COM2,在笔记本上有时,有COM3没有COM2,一般你就打开COM1就可以了
mjun007 2004-09-21
  • 打赏
  • 举报
回复
怎么联系,贴不出代码,系统总提示说"请不要发表可能给我们带来伤害的言论",真没办法。
nokir 2004-09-21
  • 打赏
  • 举报
回复
就是这个啊CommName:表示 COM1、 COM2等串口的名字;
现在我要动态的改变他的名字,难道我要每次把CommName的属性修改一下吗?并且,我要在其他的机子上用,也要到设备管理器,打开端口那一项,看一下通讯端口有哪几个吗?没有其他的办法测试端口吗/急,!
mjun007 2004-09-21
  • 打赏
  • 举报
回复
还有个属性OnReceiveError : procedure(Sender: TObject; EventMask : DWORD)

当接收数据出现错误时将触发该事件.
mjun007 2004-09-21
  • 打赏
  • 举报
回复
你可以用SPCOMM控件的Startcomm方法打开串口,从一开始,当打开失败时

会报错,另外你可到设备管理器,打开渡口那一项,看一下通讯端口有哪

几个。
把一些SPCOMM的几个基本属性、方法和事件介绍一下,
1.属性

CommName:表示 COM1、 COM2等串口的名字;
BaudRate:根据实际需要设定的波特率,在串口打开后也可更改此值,实际

波特率随之更改;

ParityCheck:表示是否需要奇偶校验;

ByteSize:根据实际情况设定的字节长度;

Parity:奇偶校验位;

StopBits:停止位;

SendDataEmpty:这是一个布尔型属性,为 true时表示发送缓存为空,或

者发送队列里没有信息;为 false时表示发送缓存不为空,或者发送队列

里有信息。

2.方法

Startcomm方法用于打开串口,当打开失败时通常会报错。错误主要有 7种

:⑴串口已经打开;⑵打开串口错误;⑶文件句柄不是通信句柄;⑷不能

够安装通信缓存;⑸不能产生事件;⑹不能产生读进程;⑺不能产生写进

程;

StopComm方法用于关闭串口,没有返回值;

WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word )方法

是个带有布尔型返回值的函数,用于将一个字符串发送到写进程,发送成

功返回 true,发送失败返回 false。执行此函数将立即得到返回值,发送

操作随后执行。该函数有两个参数,其中 pDataToWrite是要发送的字符串

, dwSizeofDataToWrite是发送字符串的长度。

3.事件

OnReceiveData :procedure (Sender: TObject;Buffer:

Pointer;BufferLength: Word) of object

当有数据输入缓存时将触发该事件,在这里可以对从串口收到的数据进行

处理。 Buffer中是收到的数据, BufferLength是收到的数据长度

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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