求助,一个SPCOMM串口通信的问题
用SPCOMM做串口通信,发送/接收数据基本正常,但遇到个问题:
收数的时候总是会出现"External exception xxxxxx"或者"非法的读写访问xxxxxx"的错误,发送过程很简单,就是把edit1里的一串16进制文本转成byte数组,然后发送,这问题,就是接收有问题,代码如下:
- Delphi(Pascal) code
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到。
- Delphi(Pascal) code
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 endend;
而且,
- Delphi(Pascal) code
else with msg do begin Result:= DefWindowProc(fHwnd, Msg, wParam, lParam); end; // with
是我后来加的,是不是我用的spcomm有问题呢?
求帮助,求破!!!
谢谢!!!
[解决办法]
move(buffer^,CommData[0],bufferlength);