用SPCOMM写过通讯程序的朋友帮我看看。(100分)

阿虫

Unregistered / Unconfirmed
GUEST, unregistred user!
我用SPCOMM写了一段232通讯程序,如下,可发现我要发送的数据发到串口上时,全变成了
零,我请教了一位朋友,他要我将SPCOMM的属性‘replacedchar=#0’设为空试试,可我发现没用,
设为空后在运行时会自动改回来的,请问大家我的程序那里有问题呀!急急急!
var
Form1: TForm1;
VIEWSTRING,s,s100:STRING;
I100,k100:INTEGER;
RBUF,SBUF:ARRAY[1..255] OF BYTE;
p:pchar;

implementation

{$R *.DFM}

procedure TForm1.onshow(Sender: TObject);
begin
COMM1.STARTCOMM;
end;

procedure TForm1.onclose(Sender: TObject; var Action: TCloseAction);
begin
COMM1.STOPCOMM;
end;
PROCEDURE SENDDATA;
VAR
I:INTEGER;
COMMFLG:BOOLEAN;
BEGIN
VIEWSTRING:='';
COMMFLG:=TRUE;
FOR I100:=0 TO (k100 div 2)-1 DO
BEGIN
IF NOT FORM1.COMM1.WRITECOMMDATA(@SBUF,1) THEN
BEGIN
COMMFLG:=FALSE;
BREAK;
END;
SLEEP(0);
VIEWSTRING:=VIEWSTRING+INTTOHEX(SBUF,2)+''; END;
VIEWSTRING:='发送'+VIEWSTRING;
FORM1.MEMO1.LINES.ADD(VIEWSTRING);
FORM1.MEMO1.LINES.ADD('');
IF NOT COMMFLG THEN MESSAGEDLG('发送失败',mterror,[mbyes],0);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
s1,s2,s3,s4,s5:string;
k,k1,k0,i:integer;
begin
k:=strtoint(edit1.text);
s:=formatfloat('000000000000',k);
k1:=length(s); //求S的字符长度。
for i:=1 to( k1 div 2) do
s1:=s1 +copy(s,k1-2*i+1,2);
for i := 0 to length(s1) div 2 -1 do
begin
k0 := (K0 + strtoint(IntToStr(StrToInt64('$' + copy(s1, 2 * i - 1, 2)))));

end;
s2:=inttohex(strtoint64(inttostr(k0+555)),0);
s3:=stringofchar('0',2-length(s2))+s3 ;
s4:=s3+s2;
s5:=copy(s4,length(s4)-1,2);
begin
if radiobutton1.checked then
richedit1.text:=('FE'+'FE'+'68'+s1+'68'+'01'+'02'+'65'+'F3'+s5+'16') else//我要发的数据。
richedit1.text:='' ;
end;
begin
k100:=length(richedit1.text);
FillMemory(@sbuf,255,0);
for i100:=0 to (k100 div 2)-1 do
s100:=s100+chr(strtoint('$'+copy(richedit1.text,2*i100+1,2)));
p:=Pchar(s100);
CopyMemory(@sbuf,p,Strlen(p));
senddata;
end;
end;
 
例子:
procedure TFrmMain.SendData;
var
viewstring:string;
i:integer;
begin
comm1.WritecommData(pchar(@SendBuffer),SendBufferLength);
for i:=0 to SendBufferLength-1 do
viewstring:=viewstring+inttohex(SendBuffer,2)+' ';
viewstring:='发送:'+viewstring;
MemoMSG.Lines.Add(viewstring);
MemoMSG.Lines.Add(' ');
end;
 
可以和你联系吗,这个问题我很头痛啊。
 
Email:yansh@sina.com
QQ:15796739
 
还有没有人可以帮我呀。SOS SOS SOS
 
真搞不懂这么多人都用Spcomm,顶类的通讯控件TurboPower都不用,真怪!
 
老大,站在那山就唱那支歌吗,目地就是达到所要的结果而已,正所谓罗卜青菜可有所爱吗,
会不会呀,请指教呀,谢谢了。
 
CopyMemory(@sbuf,p,Strlen(p));
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~是不是这地方有问题?
 
唉呀,你还在呀,s:=formatfloat('000000000000',k);好象和这里有关的,如果将零换成
其它整数,发送出去就行的,数据也是对的,好象是replacedchar=#0,这里有问题,可我设成别的
值也不行么。更无法设成空值,那样它会自支改回来的。
 
我忍不住要说:
阿虫:
你的程序是面向对象的吗??
这么在TForm1的事件程序中出现了 FORM1. 啊 。
其实串口通讯,最可靠的是使用win32API.
 
是呀,面对对象的还有问题吗。
我的问题可以解决吗。写过这方面的程序没有啊。
 
大侠,在那里呀,因该不是大问题呀。谁可相帮,另送200分,对一个穷翁来说,这很难得了呀。
我的QQ51551905。EMAIL:ZGNXBB@SINA.COM.
请和我联系,我发原程序过去。
 
comm2.WriteCommData(sendchar,numread+2);//发送串
注意属性设置,
FOR I100:=0 TO (k100 div 2)-1 DO
BEGIN
IF NOT FORM1.COMM1.WRITECOMMDATA(@SBUF,1) THEN
//i一直都是0,而且发送的都是内存当中空的,当然为0IF NOT FORM1.COMM1.WRITECOMMDATA(@SBUF[I100],1) THEN
//SBUF,1]你是从1开始的,
SBUF[0]是系统外部的
 
给分了!!
 
DCSDCS老兄,你好象说的对的,我也发现这个地方有问题的,但不知好何解决,可以说的更清
楚点吗。你的意思是多直接发送字符串吗。
 
好象当时我测试的时候很好的哦!
 
smj_9547,啊,有这回事,你在WIN98下测的吗,用的是我的这段程序吗,我是在WINME下
写的。是这个原因??????
 
朋友们,你们好,通过检查我发现,原来下面的i应是I100,
IF NOT FORM1.COMM1.WRITECOMMDATA(@SBUF,1) THEN//此处i应是I100。
BEGIN
COMMFLG:=FALSE;
BREAK;
END;
SLEEP(0);
VIEWSTRING:=VIEWSTRING+INTTOHEX(SBUF,2)+''; END;//此处i应是I100。
可是,我原来要发送的数据'FE'+'FE'+'68'+‘S1‘+'68'+'01'+'02'+'65'+'F3'+s5+'16')
中,s1:=formatfloat('000000000000',k);//K=LENGTH(EDIT1。TEXT);
所以在发送的数组中有几个零的,可我发现,发到串口上成了FEFE68SN(SN是EDIT1)中的
数,前面是对了,可后面因为有几个零,它将以后所有的数都变成了零,咋回事?
s1:=formatfloat('000000000000',k);//这个地方如果将0000000000换成别的数,就没问题,这是咋回事。
 
我在此感谢YANSH大哥,他帮我将我的程序改写,可以正常执行,真的谢谢了。同时也谢谢
其他几位朋友,感谢你们的热心相助。谢谢。
 
接受答案了.
 
顶部