求助,一个SPCOMM串口通信的问题

春风老少年 2012-09-24 03:14:42
用SPCOMM做串口通信,发送/接收数据基本正常,但遇到个问题:
收数的时候总是会出现"External exception xxxxxx"或者"非法的读写访问xxxxxx"的错误,发送过程很简单,就是把edit1里的一串16进制文本转成byte数组,然后发送,这问题,就是接收有问题,代码如下:

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i: Integer;
CommData: Array of Byte;
begin
SetLength(CommData, BufferLength);
Move(Buffer, CommData, BufferLength); //接收串口数据

for I := 0 to BufferLength - 1 do // Iterate
begin
Memo1.Text:= Memo1.Text+ IntToHex(CommData[i],2)+ #32;
end; // for}
edit2.Text:= IntToStr(bufferLength);
end;

跟踪调试发现,当move函数起作用的时候,就会出现上述的异常,如果把move函数注释掉,就不会报错,但是就没办法收数了……
edit2里显示的串口收到的数据长度也没有错。就是move函数那,但是跟踪调试发现,move函数起作用的时候正常的拷贝内存了,那里也没有保存,但就是收到一包数据后就报错……
还有,查看spcomm的源码,发现spcomm没有处理消息,一直case...end,没有任何消息被case到。

procedure TComm.CommWndProc( var msg: TMessage );
begin
case msg.msg of
PWM_GOTCOMMDATA:
begin
ReceiveData( PChar(msg.LParam), msg.WParam );
LocalFree( msg.LParam )
end;
PWM_RECEIVEERROR: ReceiveError( msg.LParam );
PWM_MODEMSTATECHANGE:ModemStateChange( msg.LParam );
PWM_REQUESTHANGUP: RequestHangup;
PWM_SENDDATAEMPTY: _SendDataEmpty
else
with msg do
begin
Result:= DefWindowProc(fHwnd, Msg, wParam, lParam);
end; // with
end
end;

而且,

else
with msg do
begin
Result:= DefWindowProc(fHwnd, Msg, wParam, lParam);
end; // with


是我后来加的,是不是我用的spcomm有问题呢?
求帮助,求破!!!
谢谢!!!
...全文
89 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
春风老少年 2012-09-25
  • 打赏
  • 举报
回复
谢谢!终于解决了,就是这个指针搞的…
习惯了C的指针,我一遇到Delphi的指针就头大,总是记不住到底怎么表达,一遇到指针就出问题…
ps. buffer参数不是本来就声明为指针变量吗,为什么还要加^?还有,数组名不是代表数组的地址吗,为什么要用commdata[0]?
谢谢!
kaikai_kk 2012-09-24
  • 打赏
  • 举报
回复
move(buffer^,CommData[0],bufferlength);
春风老少年 2012-09-24
  • 打赏
  • 举报
回复
打错一句话“那里也没有保存”应该是“那里也没有报错”

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧