大家看看下面的代码?

jy_1201 2003-04-17 11:04:00
procedure TForm1.Button1Click(Sender: TObject);
var
hCom:THandle;
Timeout:TCommTimeouts;
Dataout,Datain:pchar;
Overlapped:POverlapped;
BufferSize:DWORD;
begin
hcom:=CreateFile('Com3',
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,
0);
Timeout.ReadIntervalTimeout:=10;
Timeout.ReadTotalTimeoutMultiplier:=20;
Timeout.ReadTotalTimeoutConstant:=30;
SetCommTimeouts(hCom,Timeout);
SetEvent(hCom);

Dataout:='S';
GetMem(overlapped,sizeof(TOverlapped));
BufferSize:=4096;
GetMem(Datain,4096);

if WriteFile(hCom,Dataout,1,BufferSize,Overlapped) then
showmessage('Write Right');
if ReadFile(hCom,Datain,1,BufferSize,Overlapped) then
showmessage('Read Right');

//showmessage(string(Datain));

FreeMem(Datain);
FreeMem(Overlapped);
Closehandle(hCom);
end;

上面的代码应该是发送一字符,读取一个字符,上面的代码能否正确执行,得到想要的结果,这个代码我找来的。
...全文
39 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaocha 2003-04-18
  • 打赏
  • 举报
回复
好多问题:
1 串口没有设置SetCommState,PurgeComm,SetupComm,SetCommTimeouts
2 没有设置WriteTotalTimeOutXXX,且ReadTotalTimeoutConstant太小
3 TOverlapped没有清0
4 没有检查WriteFile和ReadFile的返回值,返回False时要用GetOverlappedResult获得实际读写的字节数,如果等于要读写的字节数,也要认为成功
jy_1201 2003-04-18
  • 打赏
  • 举报
回复
不是啊,我的是串口问题,用的是API函数WriteFile和ReadFile,而你给的是Delphi本身的函数FileRead,应该不是这个原因吧。
yzdiyu 2003-04-18
  • 打赏
  • 举报
回复
应该用指针啊
yzdiyu 2003-04-18
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/1669/1669798.xml?temp=.5736963
一样的错吧
WriteFile(hCom,Dataout^,1,BufferSize,Overlapped)
jy_1201 2003-04-18
  • 打赏
  • 举报
回复
各位放心,等我调试通了,我一定开帖给你们分。
zyplwt 2003-04-18
  • 打赏
  • 举报
回复
这不是串口通信,一顿API函数么,估计上面代码不能执行,写的太简单了,好象缺点什么东西
我看小查说的不错
xiaocha 2003-04-18
  • 打赏
  • 举报
回复
好不容易才找到一个N年前些的控件,给你参考参考,分可不能少 :)

unit SNCOMM;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TSNCOMM = class(TComponent)
private
{ Private declarations }
FPortName: String;
FComHandle: THandle;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function Connect(ComPort: Byte; bps: Cardinal): Boolean;
procedure Disconnect;
function Read(var Buff; Bytes: Cardinal): Cardinal;
function Write(var Buff; Bytes: Cardinal): Cardinal;
function ReadByte(var B: Byte): Boolean;
function SendByte(B: Byte): Boolean;
function WriteByte(B: Byte): Boolean;
procedure Clear;
function BytesNeedRead: Cardinal;
function Connected: Boolean;
procedure FlushBuffers(Rx,Tx: Boolean);

property PortName: String read FPortName;
published
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Standard', [TSNCOMM]);
end;

{ TSNCOMM }

function TSNCOMM.BytesNeedRead: Cardinal;
var
err: Cardinal;
cs: TCOMSTAT;
begin
Result := 0;
if not Connected then Exit;
if not ClearCommError(FComHandle,err,@cs) then Exit;
Result := cs.cbInQue;
end;

procedure TSNCOMM.Clear;
begin
if not Connected then Exit;
PurgeComm(FComHandle,PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR);
end;

function TSNCOMM.Connect(ComPort: Byte; bps: Cardinal): Boolean;
var
dcb: TDCB;
tos: TCOMMTIMEOUTS;
n: Cardinal;
begin
Result := False;
if Connected then Exit;

case bps of
110: n := CBR_110;
300: n := CBR_300;
600: n := CBR_600;
1200: n := CBR_1200;
2400: n := CBR_2400;
4800: n := CBR_4800;
9600: n := CBR_9600;
14400: n := CBR_14400;
19200: n := CBR_19200;
38400: n := CBR_38400;
56000: n := CBR_56000;
57600: n := CBR_57600;
115200: n := CBR_115200;
128000: n := CBR_128000;
256000: n := CBR_256000;
else Exit;
end;

FPortName := Format('COM%d',[ComPort]);
FComHandle := CreateFile( PChar(FPortName),
GENERIC_READ or GENERIC_WRITE,
0, // Not shared
nil, // No security attributes
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,
0 // No template
) ;
if Connected then
begin
FillChar( dcb, SizeOf(dcb), 0 );
dcb.DCBLength := sizeof(dcb);
dcb.BaudRate := n;
dcb.Flags := 1; { binary mode }
dcb.ByteSize := 8;
dcb.Parity := 0;
dcb.StopBits := 0;

tos.ReadIntervalTimeout := 100;
tos.ReadTotalTimeoutMultiplier := 100;
tos.ReadTotalTimeoutConstant := 1000;
tos.WriteTotalTimeoutMultiplier := 100;
tos.WriteTotalTimeoutConstant := 1000;

Result := True;

if SetCommState( FComHandle, dcb )
and PurgeComm( FComHandle, PURGE_TXABORT or PURGE_TXCLEAR or PURGE_RXABORT or PURGE_RXCLEAR )
and SetupComm( FComHandle, 100, 100 )
and SetCommTimeouts( FComHandle, tos )
then Exit;

Disconnect;
Result := False;
end;

FPortName := '';
end;

function TSNCOMM.Connected: Boolean;
begin
Result := FComHandle <> INVALID_HANDLE_VALUE;
end;

constructor TSNCOMM.Create(AOwner: TComponent);
begin
inherited;
FComHandle := INVALID_HANDLE_VALUE;
end;

destructor TSNCOMM.Destroy;
begin
Disconnect;
inherited;
end;

procedure TSNCOMM.Disconnect;
begin
if Connected then
begin
CloseHandle(FComHandle);
FComHandle := INVALID_HANDLE_VALUE;
end;
end;

procedure TSNCOMM.FlushBuffers(Rx, Tx: Boolean);
var
Flag: Cardinal;
begin
if not Connected then Exit;
Flag := 0;
if Rx then Flag := Flag or PURGE_RXABORT or PURGE_RXCLEAR;
if Tx then Flag := Flag or PURGE_TXABORT or PURGE_TXCLEAR;
if Flag <> 0 then PurgeComm(FComHandle,Flag);
end;

function TSNCOMM.Read(var Buff; Bytes: Cardinal): Cardinal;
var
ol: TOVERLAPPED;
begin
Result := 0;
if not Connected then Exit;

FillChar(ol,SizeOf(ol),0);
if not ReadFile(FComHandle,Buff,Bytes,Result,@ol) then
GetOverlappedResult(FComHandle,ol,Result,True);
end;

function TSNCOMM.ReadByte(var B: Byte): Boolean;
begin
Result := Read(B,1) = 1;
end;

function TSNCOMM.SendByte(B: Byte): Boolean;
begin
Result := Write(B,1) = 1;
end;

function TSNCOMM.Write(var Buff; Bytes: Cardinal): Cardinal;
var
ol: TOVERLAPPED;
begin
Result := 0;
if not Connected then Exit;

FillChar(ol,SizeOf(ol),0);
if not WriteFile(FComHandle,Buff,Bytes,Result,@ol) then
GetOverlappedResult(FComHandle,ol,Result,True);
end;

function TSNCOMM.WriteByte(B: Byte): Boolean;
begin
Result := Write(B,1) = 1;
end;

end.
jy_1201 2003-04-17
  • 打赏
  • 举报
回复
就是,Datain算什么东西,接收上来的码?,不管Dataout为多少它的值都一样
showmessage(string(Datain));
不知道这样发送接接收对不对啊。哪位有人帮忙看看
lihongyue 2003-04-17
  • 打赏
  • 举报
回复
执行之后,什么反应也没有。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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