我也用Spcomm控件,请问这样的问题怎么解决 构造一个函数,其返回值有多个内容的。应该怎么构造?? 比如说我要构造一个得到门禁机信息的函数。其返回值应该包括这个门禁机的号码(Address),板号(boardID),出入记录多少(nCord),人员信息多少(nPerson)及系统时间(SysTime)。。 我用了一个发送过程Transmit和一个接收过程ReadData,发送的是字符串,接收的也是一个整的字符串。。我构造的函数如下: Function GetDoorInf(Address:integer):shortstring;//提取门禁机的信息 var i:integer; a,b,c,d:shortstring; begin i:=4; while i>0 do begin bagsize:=chr($03); s0:=start;//同步字符 s1:=start; s2:=chr($81);//命令字符 s3:=chr(Address); s4:=bagsize; send:=s0+s1+s2+s3+s4;//发送字符串 Transmit;//发送命令 ReadData;//接收命令 Result:=Receive;//接收字符串Receive Raddress:=r3; r0:=copy(Receive,1,1); r1:=copy(Receive,2,1); r2:=copy(Receive,3,1); r3:=copy(Receive,4,1); bagnumber:=copy(Receive,5,2); r4:=copy(Receive,7,9); if r2=chr($91) then//数据处理与分离 BoardID:=StrToInt(copy(r4,1,1)); a:=copy(r4,2,1); nperson:=ord(a[1]); b:=copy(r4,3,2); nOpenCount:=ord(b[1])*ord(b[2]); c:=copy(r4,5,2); MDelay:=inttostr(ord(c[1]))+inttostr(ord(c[2])); d:=copy(r4,7,3); SupOrder:=inttostr(ord(d[1]))+inttostr(ord(d[2]))+inttostr(ord(d[3])); if r2=chr($C1) then i:=i-1; end end; 请问为什么我调用的时候就错了,这样构造对不?要不要把发送和接收分开,不在同一个函数里啊?接收另外判断吗?? ~~~~~~~~~~~~~~~~~~~~~~~~ 世界因为你我而年轻! ☆★○●◎◇◆□■△▲※
接收和发送应该分开处理。 Function GetDoorInf(Address:integer):shortstring;//提取门禁机的信息 var i:integer; a,b,c,d:shortstring; begin ... //Transmit;//发送命令 comm1.writecommdate(pchar(send),length(send)); end;在comm1的onreceivedate事件中处理; //Result:=Receive;//接收字符串Receive receive:=pchar(buffer); len:=integer(bufferlength);//接收字符串的长度
我用spcomm进行串口通讯没有发生过问题
spcomm很好用的。
你把你的程序发过来给我,或者贴出来。。
我的email:[email protected]
大家一起探讨。
构造一个函数,其返回值有多个内容的。应该怎么构造??
比如说我要构造一个得到门禁机信息的函数。其返回值应该包括这个门禁机的号码(Address),板号(boardID),出入记录多少(nCord),人员信息多少(nPerson)及系统时间(SysTime)。。
我用了一个发送过程Transmit和一个接收过程ReadData,发送的是字符串,接收的也是一个整的字符串。。我构造的函数如下:
Function GetDoorInf(Address:integer):shortstring;//提取门禁机的信息
var
i:integer;
a,b,c,d:shortstring;
begin
i:=4;
while i>0 do
begin
bagsize:=chr($03);
s0:=start;//同步字符
s1:=start;
s2:=chr($81);//命令字符
s3:=chr(Address);
s4:=bagsize;
send:=s0+s1+s2+s3+s4;//发送字符串
Transmit;//发送命令 ReadData;//接收命令
Result:=Receive;//接收字符串Receive
Raddress:=r3;
r0:=copy(Receive,1,1);
r1:=copy(Receive,2,1);
r2:=copy(Receive,3,1);
r3:=copy(Receive,4,1);
bagnumber:=copy(Receive,5,2);
r4:=copy(Receive,7,9);
if r2=chr($91) then//数据处理与分离
BoardID:=StrToInt(copy(r4,1,1));
a:=copy(r4,2,1);
nperson:=ord(a[1]);
b:=copy(r4,3,2);
nOpenCount:=ord(b[1])*ord(b[2]);
c:=copy(r4,5,2);
MDelay:=inttostr(ord(c[1]))+inttostr(ord(c[2]));
d:=copy(r4,7,3);
SupOrder:=inttostr(ord(d[1]))+inttostr(ord(d[2]))+inttostr(ord(d[3]));
if r2=chr($C1) then
i:=i-1;
end
end;
请问为什么我调用的时候就错了,这样构造对不?要不要把发送和接收分开,不在同一个函数里啊?接收另外判断吗??
~~~~~~~~~~~~~~~~~~~~~~~~
世界因为你我而年轻!
☆★○●◎◇◆□■△▲※
Function GetDoorInf(Address:integer):shortstring;//提取门禁机的信息
var
i:integer;
a,b,c,d:shortstring;
begin
...
//Transmit;//发送命令
comm1.writecommdate(pchar(send),length(send));
end;在comm1的onreceivedate事件中处理;
//Result:=Receive;//接收字符串Receive
receive:=pchar(buffer);
len:=integer(bufferlength);//接收字符串的长度
Raddress:=r3;
r0:=copy(Receive,1,1);
r1:=copy(Receive,2,1);
...
end;
世界因为你我而年轻!
☆★○●◎◇◆□■△▲※
procedure TForm1.BitBtn5Click(Sender: TObject);
var tmp:string;
pDataToWrite:Pchar;
dwSizeofDataToWrite:Word;
begin
tmp:=memo2.Text;
dwSizeofDataToWrite:=length(tmp);
pDataToWrite:=pchar(tmp);
Comm1.WriteCommData(pDataToWrite,dwSizeofDataToWrite);
sleep(1000);
end;接收程序如下:
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var buff:string;
count:integer;
begin
////////////////////////////////////
//开始接收数据
//////////////////////////////////////////////
buff:=PChar(buffer);
count:=integer(bufferlength);
buff:=copy(buff,1,count);
tbuff:=tbuff+buff;
memo1.Text:=tbuff;
end;在memo2中写入字符,发送后应该在memo1中显示相同的字符,在uedit中编辑一个字符串,其中包含十六进制的字符$11和$13,将整个字符串拷贝到memo2中,发送后将memo1中收到的字符串拷贝到uedit中,十六进制显示中没有$11和$13这两个字符,其他字符都有。
我给你段我的程序吧,你看看var
r_b:ARRAY oF CHAR ;beginsetlength(r_b,bufferlength);
move(buffer^,r_b,bufferlength); memo1.Text:=r_bend;
我用你的程序无法发送$11,$13啊
************
* 努力学习 *
* 全为 *
*¥人民币¥*
************
#13,是回车,你要显示什么呢************
* 努力学习 *
* 全为 *
*¥人民币¥*
************
for i:=0 to bufferlength-1 do
memo1.text:=memo1.text+IntToHex(ord(r_b[i]))
************
* 努力学习 *
* 全为 *
*¥人民币¥*
************
我试过了,用SPCOMM控件不能发送$11和$13,在连续发送$01到$FF时,结果只显示0102030405060708090A0B0C0D0E0F10121415161718191A1B1C(十六进制),后面没有显示,而且可能是接收了一个PAUSE的命令,再次发送无响应,必须重新打开端口才能发送。
只要字符串中不包含$11和$13,所有字符串都能发送和接收,
只要包含$13,发送接收后必须重新打开端口才能再次发送。
包含$11,能多次发送,但是不能接收到$11。
有兴趣的人可以试一试,昨天回去查了一下,只要用一个9针的串口,将2和3短接,就可以实现同一端口的发送和接收。
改用MSCOMM控件没有问题,所有字符都可以发送和接收,这可能是SPCOMM的BUG吧。
com1-com2啊,呵呵,一直这么用啊2,3交换,5直接连接
短接不太好。那样,你自己发的东西也回来了。
spcom的这个属性改成 flase就可以了
************
* 努力学习 *
* 全为 *
*¥人民币¥*
************