###############大家帮忙看看了,一个MSCOmm的问题

Hermit 2003-07-22 09:08:16
function RecData( FMLen : Integer) : String; stdcall; export;
var
xTmp : Olevariant;
xScr : array of byte;
xStr : String;
i, j, count : Integer;
xLen, xTck : Integer;
begin

Sleep(1);
xStr := '';
xLen := 0;
xTck := GetTickCount;

repeat
Application.ProcessMessages;

if (((GetTickCount - xTck) /1000) > 3) then
begin
Result := '';
Exit;
end;

i:=xComm.InBufferCount;
Sleep(10);
i:=xComm.InBufferCount;

if i>0 then
begin
xTmp := xComm.Input;
SetLength(xScr,i);
xScr := xtmp;

for j:=0 to i-1 do
xStr := xStr +inttoHex(xScr[j],2);
end;

xLen := Length(xStr);

until (xLen = FMLen);

Result := xStr;

end;

这段代码比较不稳,时而接的到数据,时而接收不到数据,下位机是我自己写的,用调试工具测试过,没有任何问题。

各位大侠帮忙先,谢谢
...全文
30 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yesxwl 2003-07-22
  • 打赏
  • 举报
回复
有没有可能3 秒这内数据来不及传输过来
Hermit 2003-07-22
  • 打赏
  • 举报
回复
发出来看过了,i=0,然后超时退出
yesxwl 2003-07-22
  • 打赏
  • 举报
回复
接收不到数据时是一部分没有还是全无?
yesxwl 2003-07-22
  • 打赏
  • 举报
回复
实际上没这么快。
在mscomm的oncomm事件中检查一下有无错误
不用时间控制,试试
给你参考下
procedure TFrmDial.MSComm1Comm(Sender: TObject);
var
InputStr:String;
InputResult:OLEVariant;
Chr:char;
begin

Case MSComm1.CommEvent of //通讯错误
ComEventBreak:LblStatu.Caption:='ComEventBreak';
ComEventCTSTo:LblStatu.Caption:='ComEventCTSTo';
ComEventDSRTo:LblStatu.Caption:='ComEventDSRTo';
ComEventFrame:LblStatu.Caption:='ComEventFrame';
ComEventOverRun:LblStatu.Caption:='ComEventOverRun';
ComEventCDTo:LblStatu.Caption:='ComEventCDTo';
ComEventRxOver:LblStatu.Caption:='ComEventRxOver';
ComEventRxParity:LblStatu.Caption:='ComEventRxParity';
ComEventTxFull:LblStatu.Caption:='ComEventTxFull';
ComEventDCB:LblStatu.Caption:='ComEventDCB';
//通讯事件
ComEvSend:LblStatu.Caption:='送出数据';
ComEvCTS:LblStatu.Caption:='ComEvCTS';
ComEvDSR:LblStatu.Caption:='ComEvDSR'; //1 TO 0
ComEvCD: begin
SuccessFlag.SetEvent;

LblStatu.Caption:='连接成功';
BtnOutput.Enabled:=True; //允许输出指令至对方MODEM
Sleep(1000);
MSComm1.InputLen:=0;
inputResult:=MSComm1.Input; //清空输入缓冲区;
InputStr:=InputResult;

MSComm1.InputLen:=1;

MSComm1.Output:='B'; //查询指令;
sleep(100);

StartReceive:=True; //开始接收数据标志
Count:=1;
end;
comEVReceive: begin

LblStatu.Caption:='接收数据';
InputStr:=MSComm1.Input;


BtnBreak.Enabled:=True;
MemoData.Lines.Add(InputStr); //接收到数据,>RThreshold
end;
end;
Hermit 2003-07-22
  • 打赏
  • 举报
回复
不可能啊,我传送了705个字符,使用115200,肯定够的

5,388

社区成员

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

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