还是串口的问题。做过的朋友指教一、二。(200分)

  • 主题发起人 主题发起人 1111
  • 开始时间 开始时间
1

1111

Unregistered / Unconfirmed
GUEST, unregistred user!
现在的问题是:
我要向COMM1写入66,是字节不是字符串。但各种串口控件都要转换一下。我真是搞不懂了。
是用字节数组的方法,但我一知半解。特向高手请教相关知识。
var
Buf: Array[1..256] of Byte;
begin
buf[1]:=66;
Comm1.write(????);
???处该如何写,谢谢谢谢。

还有,上次经一位朋友指教,得到如下代码。能够取的数据,但也是一知半解。具体是何含义?
GetMem(Buf,BufferLength*2);
BinTohex(PChar(Buffer),Buf,BufferLength);
 
var
Buf: Array[1..256] of Byte;
begin
buf[1]:=66;
Comm1.WriteCommData(@buf[1],1);
end;

在com 的onReceiveData事件這樣寫:
procedure TLed.comReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word) stdcall;
VAR Str:String;
begin
SETlength(STR,BUFFERLENGTH);
move(BUFFER^,Str,BUFFERLENGTH);
Str:=trim(Str);
showmessage(Str);
end;

 
其中:BUFFERLENGTH這個是返回的字符個數;
move(BUFFER^,Str,BUFFERLENGTH);是將緩衝的數據放到str變量
 
如需要写入1,2,3,4,5五个数值,则
先由它们组成一个字符串,然后再把字符串发送出去。
SendStr:=chr(1)+chr(2)+chr(3)+chr(4)+chr(5);
对方接收到后,收到的就是一个字符串,假设接收到ReceiveStr中,则
var i:integer;
ValueStr:string;
ValueStr:'接收到的数值分别为:';
for i:=1 to length(ReceiveStr) do
ValueStr:=ValueStr+inttostr(ord(ReceiveStr))+' ';
showmessage(ValueStr);

chr() 将数值转换为字符
ord() 将字符转换为数值
 
如果發送的是字符,則要轉成byte再發;
var a:byte;
begin
a:=ord('a') ;
Comm1.WriteCommData(@a,1);
end;
 
谢谢两位。我现在用的是SPCOMM,请问,这个控件的反应快不快。程序中有一个循环,是连续
从串口中读入数据,但都是第一个能出来,后边的就读不出来。如果在中简加一下showmessge,
就可以了。各位有过这样的问题吗?


 
不需要循环吧,SPCOMM本身有一个事件,一旦收到数据就会响应这个事件的。
 
spcomm应该有接受数据事件的,在那里读就可以了,不要直接读。
 
我现在做一个串口通讯。原理是:发送66,收到第一条记录。发送67,下一条记录。现想读
三条记录,用了一个FOR循环。现在的问题是,我发送66,串口能返回第一条正确的记录,
但下一条死活读不出来。各位看看代码,错在那里,还是我没有理解好SPCOMM.
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
Buf: Array[1..10] of Byte;
i:integer;
begin
Buf[1]:=66;
Buf[2]:=67;
for i:=1 to 3 do
begin
comm1.WriteCommData(@buf[1],1);
Comm1.WriteCommData(@Buf[2],1);
end;
接收事件和大家写的一样。各位遇到这种问题会如何解决。
 
还有,我另找一两个控件,但不会用其writebuf,事件,如果想写66(字节)到串口,该如何写
 
那位有经验的朋友指教一、二。谢谢了
 
发送chr(66)
 
为什么要分两条写呢?直接发两个字节不好吗?spcomm可能在操作的时候有一个延时,你在
两句之间加一句sleep看看。我当时在spcomm控件start之后再紧接着receive的话也会报错,
之间加一句sleep就好了。
 
加sleep也是取不到第二条记录。这个设备是怎么回事???
 
报的什么错?
 
没有报错,就是没有任何反应
 
你可以在收到第一条记录,然后再发下一条命令。
另外,要注意同步问题!
 
来自:sunwill, 时间:2003-5-19 11:03:00, ID:1873817
你可以在收到第一条记录,然后再发下一条命令。
另外,要注意同步问题!

我现在是先发送66,收到放在MEMO中,然后再发送67,读下一条。同步问题如何控制?
 
最好把你的发送数据与接收数据的代码帖出来,可以让大家帮你看一下!
 
象现在的问题很难看的
 

Similar threads

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