使用控件asynopro通过COM1或COM2与硬件设备进行通信的问题(100分)

吉花

Unregistered / Unconfirmed
GUEST, unregistred user!
我要编一个通过COM1或COM2口进行通信的程序.该程序向接在COM1或
COM2口上的硬件设备发送信令,然后再接收该设备返回的信令.
信令格式为:STX+信令码+数据+ETX.
其中,STX为信令头,值始终为02H,ETX为信令结束的标志,其值始终为0DH.
连线为:2---3;3---2;5---5;8---8;
我使用的是一个叫asynopro(大概是这个名字)的控件,它有一个例子(demo),
我使用时,总是提示"Error write to:COM2",我看了一下源程序,发现问题:
假设我要发送:STX+1+ETX,那么变量S应该是:
S:='1'; S:=#2+S+#13吧!
可是单步执行时发现变量S的值却是: ''#2'1'#$D
看来是将字符串变量S前的#2做为字符了,我该怎么办?
还有就是连线中的第8脚是CTS吧?它有什么用呢?
如果有哪位能根据以上说明,提供相应的程序(附源代码),使用成功后
将奉送100!决不食言!
切盼!
 
使用MSCOMM32.OCX,MS自带
安装vb5.0后有详细的中文说明和使用

S的值是对的,只是02无法显示

CTS是硬件握手信号,如不使用硬件握手
可不管它,参见微机接口技术的书
初始化:
MSComm1.CommPort := 1;
{' 9600 波特,无奇偶校验,8 位数据,一个停止位。}
MSComm1.Settings := '2400,n,8,1';
{' 当输入占用时,告诉控件读入整个缓冲区。}
{' 打开端口。}
MSComm1.PortOpen := True;
MSComm1.Settings := '2400,n,8,1';
MSComm1.RThreshold:=6;
MSComm1.inputlen:= 0;
if MSComm1.PortOpen then
begin
initenabled:=false;
mytxinit:=true;
CsTxInitBtn.enabled:=false;
MessageDlg('通信初始化成功.'+'com'+inttostr(MSComm1.CommPort), mtInformation,
[mbOk], 0);
end
else
MessageDlg('通信口初始化错误!!!'+commname, mtInformation,
[mbOk], 0);
end;

发送

function WriteComm(Cid: Integer; Buf: PChar; Size: Integer): Integer;

asd:='b123 987 654 321 123 456 789 987 e';

MSComm1.Output := asd;

接受可用事件

procedure TCsTxForm.MSComm1Comm(Sender: TObject);
begin
Case MSComm1.CommEvent of
comEvReceive: { ' 收到 RThreshold # of chars.}
{MSComm1.inputlen:=0;}
gettxdata;
{------------------------------------------}
comEvEof: {' 输入数据流中发现 EOF 字符}
else
end;
end;

 
用<a href="ftp://202.119.200.10/pub/incoming/delphi/component">SPCOMM.zip</a>控件吧
 
你单步执行时发现变量S的值是 ''#2'1'#$D是正常的,自己写ORD(yourchar)看看
就知道了。

如果你与硬件设备通信,对方大多是单片机。用SPCOMM.zip控件效果很好
连线可以用2、3、5、7
2-3 3-2 5-5 7-7
你可以试试:
1.CTS一般发送和接受时是不同的,发送时置高,接受时置低
2.注意BAUD和STOPBIT的使用。如果还不行,试试STOPBIT改为MARK和SPACE。
3.如果乐意,可以把出问题的代码<a href="mailto:douw@cumt.edu.cn">发给我</a>,探讨一下
4.
 
这两天我也刚调完一个用串口控制外部设置的小程序,用的spcomm。
总的感觉挺好使。
字符在单步显示时的问题,我也遇到过。不过值传递是正确的。
spcomm的说明,我自已翻了一下,如果要,我可以发给你。
 
请walone将spcomm的说明email给我,好吗?
先谢谢了!
 
吉花,
我已经发出去了。收到后,给我回一封。
 
我想知道怎样使用 SPCOMM控件来编写满足如下条件的串行口通信程序?

1、COM口设置为19200bps、8 bit、no parity、1 stop-bit、no handshaking
2、串行口连线为2---3、3---2、5---5、8---8
3、命令格式为:STX+CC+Data+CR
STX为02H,CC为命令码如:1、2、3等,Data为少于32个字符的字符串,
CR为0DH,举例如下:02+1+abcdefg+0D
 
在form上加上一个spcomm控件

在设置comm子程中,或是formcreate中包含以下代码:

comm1.CommName:=COM1; //或是COM2
comm1.BaudRate:=19200; //速率设置
comm1.StopBits:=_1; //停等位为1
comm1.ByteSize:=_8; //字节长度
comm1.Parity:=None; //无校验
try
comm1.StartComm; //打开comm; 退出是应用comm1.StopComm结束
except
showmessage('通信口设置有误!');
end;


发送数据子程包含以下代码
var data,s:string;
p:pchar;
stx,cc,cr:char;
success:boolean;

begin
data:= ' ... ' //发送数据字符串
stx:=#2;cc:=#1;cr:=#$0D; //cc可以是#2,#3
s:=stx+cc+data+cr;
p:=pchar(s);
success:=comm1.WriteCommData(p,strlen(p));
if not success
then showmessage('Write error!');
end;

 
用ATComm32也可以,用法更简单一些。SPCOMM相比较复杂了一些,更适合与Modem
连接时用。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部