急急急!API的与手机串口通信,超级终端连接正常,但程序运行却不能返回OK或EROOR,详情见帖!(200分)

  • 主题发起人 主题发起人 liang1chao
  • 开始时间 开始时间
L

liang1chao

Unregistered / Unconfirmed
GUEST, unregistred user!
API的串口通讯,用以显示手机的来电显示。超级终端与手机连接可以正常通信,而代码运行却返回的是发送值(AT+CLIP=1),没有OK或者EROOR。如果先运行超级终端,然后断开,再运行代码,那么就可以正常显示来电显示了,各位大哥大姐帮忙啊,弄不出来我就挂了。主要的代码如下

procedure TForm1.Button1Click(Sender: TObject);
var
lpdcb: TDCB;
Ini: TIniFile;
com: string;
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); //设 置 输 入, 输 出 缓 冲区 皆 为4096 字 节

shezhi1:=setupcomm(hcom,4096,4096);
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;




procedure TForm1.FormCreate(Sender: TObject);
begin
Opened := False;
LoadCodeTableFromDisk;
idtcpclient1.Host := '192.168.0.8';
idtcpclient1.Port := 20000;
self.phonetype := 1;
LogInfo:=LoginSMS;
if LogInfo.User='' then application.Terminate ;
end;


constructor TComThread.Create(Handle: DWORD; HWND: DWORD);
begin
FhCom := Handle;
FHWND := HWND;
FExit := False;
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.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);// 处 理 接 收
数 据/////(就是这里的Read_Buffer运行时的到返回值,如果没有OK那么来电显示就失败了!!!!)各位大哥大姐只要能让这里出现OK就是救了我啦!!!
SetEvent(Post_Event); // 同 步 事 件 置 位

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;

整个代码就只有那里有问题,其他一切正常,只要能让返回值里面出现OK,那各位就是我的再生父母啊!!!原代码太长,所以部分没写进去,相信大哥大姐们应该看的懂了,第一次发贴,200分全丢在里面了,就靠各位了!!!!
 
为什么没有人回答我的问题啊!!
 
不好意思,学的浅看不出来,只能帮顶了~~
 
把ReadFile(hCom, Read_Buffer, cbNum, ReadNumber, @lpol);改为
ReadFile(hCom, Read_Buffer, cbNum, ReadNumber,lpol);
 
应该不是这个问题了,lpol:toverlapped与lpol:poverlapped差别应该不大把,开始就是用的poverlapped,后来才改的,但问题还是没有解决
 
哥儿们
同步方式和异步方式不能同时使用
Wait := WaitCommEvent(Fhcom, dwevtmask, nil);
改一下
把nil换成其它的实际同步变量试试
 
我看好多网上资料都这么写的,以前我也改过,只用同步没反应,只用异步就当在那里了。那么把NIL改为什么好呢,我正在学,麻烦说明白点,谢谢!
 
微软的串口API工作在同步方式时,只能一个函数在工作
不然就会死掉
解决的办法就是使用异步方式
定义几个toverlapped型变量
读、写、等待各用一个就好了
 
我把NIL改为了一个OS的toverlapped变量,结果wait就false了,代码就运行不过去了
我用你说的只用同步,多用几个变量试下。
 
串口API函数虽然不多
但是想用好也不是那么容易的
我刚搞的时候头都大了好几圈
 
哥们,我还刚刚接触DELPHI和这个这个API。。。就这个问题都干了一个多星期了,在弄不出来,后果。。。
你认为我这个问题主要是出在哪里了,因为它也不是完全错误,如果先运行超级终端,按代码需要的设置设置一下连接属性,然后断开超级终端,运行代码,那么一切就正常了。不然单独运行代码,在READFILE里面就没有手机给的返回值OK或EROOR!
 
我刚刚试过:ReadFile(hCom, Read_Buffer, cbNum, ReadNumber, @lpol);中不能取lpol这个变量的地址,否则读到都为空。把@lpol改为lpol就OK了
 
还没有搞定吗
你知道了同步和异步方式的区别
再搞这个很容易的
关键是要等待一段时间
让设备把数据发到缓冲区
 
那我就把lpol:toverlapped改为lpol:poverlapped试下,不过开始是poverlapped,是我自己改为toverlapped,希望改回来可以!
 
。。。改不过来了。。。
不过开始的是poverlapped,因为有问题我才改的Toverlapped,所以估计不行
 
你这样能收到数据吗?有没有跟踪过?
 
这样说你应该明白点
不管改没改过,需要手动设置下超级终端才能和手机正常通讯。。
 
现在改回去的话,wait就过不去了,返回是FALSE直接跳出了
 
这样说明你的串口设置有问题,你把
lpdcb.StopBits := 1;
改为lpdcb.StopBits := 0;
我记得api中StopBits :0就1,1就是1.5,1.5就是2;你修改后试试看
 
to Mike1234567890
我给读写等待一个定义了一个,但wait那里的NIL改别的值后就过不去了,返回FALSE直接跳出去了
 
后退
顶部