问题描述:基本上这是一个手机用COM串口通讯的来电显示程序,但是现在就是程序运行后,SETCOMMSTATE失败,跟踪后发现READFILE与WRITEFILE失败。但是如果手动运行WINDOWS的超级终端,并与手机连接,断开后,在运行程序,就能在MEMO中显示来电了,解决不了啊。各位大哥们帮忙啊,这是我工作叫给我的第一个问题。我是个新手,就靠各位大哥了!!!(部分代码没写进去,估计各位大哥也应该想的出来)
部分代码如下
procedure TForm1.Button1Click(Sender: TObject);
var
lpdcb: TDCB;
Ini: TIniFile;
com: string;
fdwattrsandflags:DWORD;
begin
if Opened then
Exit;
Ini := TIniFile.Create(apppath + 'config.ini'); // com:=Ini.ReadString('HW','Port','');
// IF com='' Then
Com := ComboBox1.Text;
ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(COM);
hCom := CreateFile(Pchar(ComboBox1.Text), generic_read or
generic_write, 0, nil, open_existing,
file_attribute_normal or
file_flag_overlapped, 0);
if hCom = INVALID_HANDLE_VALUE then
begin
Ini.Free;
Exit;
end; Opened := True;
SetupComm(hCom,4096,4096);
PurgeComm(hCom,PURGE_RXCLEAR );
GetCommState(hcom, lpdcb);
lpdcb.baudrate :=19200;
lpdcb.StopBits := 1;
lpdcb.ByteSize := 8;
lpdcb.Parity:=NoParity;
Setcommstate(hcom, lpdcb);
SetcommMask(hcom, EV_RXCHAR);
Ini.WriteString('HW', 'PORT', ComboBox1.Text);
Ini.Free;
//SendCMD('AT+VCID=1');
SendCMD('AT+CLIP=1');
end;
constructor TComThread.Create(Handle: DWORD; HWND: DWORD);
begin
FhCom := Handle;
FHWND := HWND;
FExit := False;
post_event:=CreateEvent(nil,true,true,nil);
read_os.hEvent:=CreateEvent(NIL,TRUE,true,NIL);
write_os.hEvent:=CreateEvent(NIL,TRUE,true,NIL);
read_os.Offset:=0;
read_os.OffsetHigh:=0;
write_os.Offset:=0;
write_os.OffsetHigh:=0;
inherited Create(False);
FreeOnTerminate := True;
end;
procedure TComThread.Execute;
var
dwEvtMask: Dword;
Wait: Boolean;
begin
fillchar(lpol, sizeof(toverlapped), 0);
while True do
begin
dwEvtMask := 0;
Wait := WaitCommEvent(Fhcom, dwevtmask, nil);
if Wait then
begin
waitforsingleobject(post_event, infinite);
resetevent(post_event);
PostMessage(FHWND, WM_COMMNOTIFY, 0, 0);
end
else
Exit;
end;
end;
procedure TForm1.SendCMD(CMD: string);
var
Buffer: array[0..127] of char;
cbNum: DWORD;
begin
Fillchar(Buffer, 128, 0);
CMD := CMD + #$0D#$0A;
StrCopy(@Buffer, Pchar(CMD));
fillchar(lpol, sizeof(toverlapped), 0);
ComThread := TComThread.Create(hCom, Handle);
WriteFile(hCom, Buffer, Length(CMD), cbNum, @lpol);
end;
procedure TForm1.MsgComProcess(var Message: Tmessage);
var
Clear: Boolean;
Coms: Tcomstat;
cbNum, ReadNumber, lpErrors: DWORD;
Read_Buffer: array[1..100] of char;
iPos, Pos2: Integer;
Num: Pchar;
tmpstr: string;
begin
Clear := Clearcommerror(hcom, lpErrors, @Coms);
if Clear then
begin
cbNum := Coms.cbInQue;
FillChar(Read_Buffer, 100, 0);
Sleep(100);
ReadFile(hCom, Read_Buffer, cbNum, ReadNumber, @lpol;
SetEvent(Post_Event);
end;
部分代码如下
procedure TForm1.Button1Click(Sender: TObject);
var
lpdcb: TDCB;
Ini: TIniFile;
com: string;
fdwattrsandflags:DWORD;
begin
if Opened then
Exit;
Ini := TIniFile.Create(apppath + 'config.ini'); // com:=Ini.ReadString('HW','Port','');
// IF com='' Then
Com := ComboBox1.Text;
ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(COM);
hCom := CreateFile(Pchar(ComboBox1.Text), generic_read or
generic_write, 0, nil, open_existing,
file_attribute_normal or
file_flag_overlapped, 0);
if hCom = INVALID_HANDLE_VALUE then
begin
Ini.Free;
Exit;
end; Opened := True;
SetupComm(hCom,4096,4096);
PurgeComm(hCom,PURGE_RXCLEAR );
GetCommState(hcom, lpdcb);
lpdcb.baudrate :=19200;
lpdcb.StopBits := 1;
lpdcb.ByteSize := 8;
lpdcb.Parity:=NoParity;
Setcommstate(hcom, lpdcb);
SetcommMask(hcom, EV_RXCHAR);
Ini.WriteString('HW', 'PORT', ComboBox1.Text);
Ini.Free;
//SendCMD('AT+VCID=1');
SendCMD('AT+CLIP=1');
end;
constructor TComThread.Create(Handle: DWORD; HWND: DWORD);
begin
FhCom := Handle;
FHWND := HWND;
FExit := False;
post_event:=CreateEvent(nil,true,true,nil);
read_os.hEvent:=CreateEvent(NIL,TRUE,true,NIL);
write_os.hEvent:=CreateEvent(NIL,TRUE,true,NIL);
read_os.Offset:=0;
read_os.OffsetHigh:=0;
write_os.Offset:=0;
write_os.OffsetHigh:=0;
inherited Create(False);
FreeOnTerminate := True;
end;
procedure TComThread.Execute;
var
dwEvtMask: Dword;
Wait: Boolean;
begin
fillchar(lpol, sizeof(toverlapped), 0);
while True do
begin
dwEvtMask := 0;
Wait := WaitCommEvent(Fhcom, dwevtmask, nil);
if Wait then
begin
waitforsingleobject(post_event, infinite);
resetevent(post_event);
PostMessage(FHWND, WM_COMMNOTIFY, 0, 0);
end
else
Exit;
end;
end;
procedure TForm1.SendCMD(CMD: string);
var
Buffer: array[0..127] of char;
cbNum: DWORD;
begin
Fillchar(Buffer, 128, 0);
CMD := CMD + #$0D#$0A;
StrCopy(@Buffer, Pchar(CMD));
fillchar(lpol, sizeof(toverlapped), 0);
ComThread := TComThread.Create(hCom, Handle);
WriteFile(hCom, Buffer, Length(CMD), cbNum, @lpol);
end;
procedure TForm1.MsgComProcess(var Message: Tmessage);
var
Clear: Boolean;
Coms: Tcomstat;
cbNum, ReadNumber, lpErrors: DWORD;
Read_Buffer: array[1..100] of char;
iPos, Pos2: Integer;
Num: Pchar;
tmpstr: string;
begin
Clear := Clearcommerror(hcom, lpErrors, @Coms);
if Clear then
begin
cbNum := Coms.cbInQue;
FillChar(Read_Buffer, 100, 0);
Sleep(100);
ReadFile(hCom, Read_Buffer, cbNum, ReadNumber, @lpol;
SetEvent(Post_Event);
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货