※※※【串口通讯的简单错误,欢迎指正!!!!!】※※※(50分)

  • 主题发起人 主题发起人 ZRWeng
  • 开始时间 开始时间
Z

ZRWeng

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
S:string;
begin
s:='';
Move(buffer^,pchar(s)^,bufferLength);//<----执行完这句后出错 Why????
Showstr:='接收字符:'+ s;
memo1.lines.add(Showstr);
memo1.lines.add('-------------------------------');
Memo1.Invalidate;
Statusbar1.SimpleText:='数据接收完毕!';
end;
//错误信息:Project Demo.exe Raised Exception Class EAccessViolation With Message
// 'Access violation at address 0040293B in module 'demo.exe'.Write of address...
使用控件SPComm
 
你把buffer设置成pchar或array [。。] of char试试
或者给getmem(s)
 
用setlength(s,bufferlength)后没出错,但接收的不是想要的字符。
后改为:
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
ShowStr:string;
i:integer;
rbuf:array[1..3] of byte;
begin
Statusbar1.SimpleText:='正在接受数据...';
ShowStr:='';
Move(buffer^,pchar(@rbuf)^,bufferLength); //<——该行执行完后也出现一样的错误,WHY???
for i:=1 to bufferlength do
showstr:=ShowStr+inttohex(rbuf,2)+' ';
memo1.lines.add(Showstr);
memo1.lines.add('-------------------------------');
Memo1.Invalidate;
Statusbar1.SimpleText:='数据接收完毕!';
End;
//我想不是很难吧,应该是指针操作有误吧,可是我不知道:( 还望各位相助。
 
踢一脚》》》
 
以下是高手发给我例子还有讲解,你试试看吧。

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: word);
var
viewstring: string;
i: integer;
//这里定义ReceiveBuffer为byte,在发送端的sendbuffer定义为integer,没关系吧?
//不影响呀,byte就是一种特殊的integer呀
ReceiveBuffer: array[0..5] of byte;
begin
//这里不能写成Move(Buffer^,pchar((@ReceiveBuffer)^), BufferLength);
//有什么区别吗?
//有,PCHAR返回是字符串指针。
Move(Buffer^, ReceiveBuffer, BufferLength);
for i := 0 to bufferlength - 1 do
viewstring := viewstring + IntToStr(ReceiveBuffer) + ' ';
//原句 viewstring:=viewstring+inttostr(ReceiveBuffer)+' ';
viewstring := '接收:' + viewstring;
Memo1.Lines.Add(viewstring);
Memo1.Lines.Add('');
if memo1.Lines.Count > 1000 then //MEMO显示的行数是有限的,达到一定行数应该清除
memo1.Clear;
end;
 
Move(buffer^,rbuf,bufferLength);还是照错不误,实在奇怪?
记得以前可以的。
 
Move(buffer^,@rbuf,bufferLength
 
@rbuf都不能编译通过。
 
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
S:string;
begin
[red]s:= pchar(buffer);[/red]
Showstr:='接收字符:'+ s;
memo1.lines.add(Showstr);
memo1.lines.add('-------------------------------');
Memo1.Invalidate;
Statusbar1.SimpleText:='数据接收完毕!';
end;
 
不会没人解决了我——————————的这个题吧:(
 
改为
Move(buffer^,pointer(s),bufferLength);
试试
 
to mk1024:
怎么接收的都是“苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘........"的字符?
这样接收的字符不是我想要的,我想返回16进制的字符串。

程序和小小K的提供的基本相同,但我怎么还是Move(buffer^,rbuf,bufferLength)错误呢?
实在搞不懂!![:(]
 
Move你用错了
不要用 Buffer^,直接用buffer
这里要传递指针,不是指向的内容
Move(buffer,rbuf,bufferLength)
如果 rbuf是动态数组,要 Move(buffer,rbuf[0],bufferLength)
 
哈哈,我不是说了嘛!要给你的字符串分配内存!否则你move什么指针啊!
用setlength字符串或者getmem(字符串,bufferLength)
 
对了,还有,应该写成这样
setlength(s,bufferLength);
Move(buffer^,pchar(s)^,bufferLength);
...
我已经帮你试过了!没问题!
 
是这样的。我用SPComm通过Com1向一外设发送通讯指令来获得外设当前状态。
var
sendData:byte;
begin
SendData:=$5;//或其他
Comm1.WriteCommData(@SendData,sizeof(SendData));
....
在Comm1ReceiveData事件中接收外设(外设通讯格式说明)向Com1口返回的应是16进制字符串(3个字节)
若用
setlength(s,bufferLength);
Move(buffer^,pchar(s)^,bufferLength);
不会出错,但接收的字符串是诸如“弿弿弿弿”之类的字符

用Move(buffer,rbuf,bufferLength)或CopyMemory(@rbuf,buffer,bufferlength)
会出现“非法操作,即将关闭程序”。在调试时会弹出CPU窗口"FF8CC600 ????"
不知为何?
烦烦烦呀,
btw: 哪有串口调试精灵下载?
 
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
s,Showstr:string;
begin
SetLength(S, BufferLength); //接收串的数据并显示Memo1上。
Move(Buffer^, PChar(S)^, BufferLength);
Showstr:='接收字符:'+s;
 memo1.lines.add(Showstr);
 memo1.lines.add('-------------------------------');
 Memo1.Invalidate;
  Statusbar1.SimpleText:='数据接收完毕!';
 
procedure TForm1.spcomm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
strreceive:array of byte;x,y:integer;
a,b,c:byte;
begin
//利用动态数组保存接收的数据。并进行处理
setlength(strreceive,bufferlength);
Move(buffer^,pbytearray(strreceive)^,bufferlength);
a:=strreceive[0];
b:=strreceive[1];
c:=strreceive[2];
end;
最好发送数据来时先发送一起始符在程序中检验到起始符后再接收以后的数据
用Pbytearray能将乱码变为byte 然后可化为十六进制
 
十分感谢各位的热心相助。
分数不多,无法均衡顾及,尚请见谅 .
 
后退
顶部