Please help me!我写了一个对串行口写数据的函数,可是一个字符也写不进去,一直在while循环中等待的
(在线等待)
function Write(var OutBuf:Pchar; NumberOfBytesToWrite:DWord):Byte;
var
  WriteOverlap:Toverlapped;
  WhereToStartWriting,NumberOfBytesWritten:DWord;
begin
  if (NumberOfBytesToWrite=0) then
  begin
    {Output buffer is empty}
    result:=6;
    exit;
  end;
  WhereToStartWriting:=0;
  NumberOfBytesWritten:=0;
  FillChar(WriteOverlap,Sizeof(WriteOverlap),0);
  WriteOverlap.hEvent:=CreateEvent(NIL,FALSE,FALSE,NIL);
  if WriteOverlap.hEvent=null then
  begin
    {CreatEvent error}
    result:=7;
    exit;
  end;
  SetCommMask(CommHandle,EV_TXEMPTY);
  While (NumberOfBytesToWrite>0) do
  begin
    if not WriteFile(CommHandle,OutBuf [WhereToStartWriting],NumberOfBytesToWrite,NumberOfBytesWritten,@WriteOverlap) then
    begin
      if (GetLastError=ERROR_IO_PENDING) then
      begin
        WaitForSingleObject(WriteOverlap.hEvent,INFINITE);
        GetOverlappedResult(CommHandle,WriteOverlap,NumberOfBytesWritten,False);
      end
      else begin
        {Write error}
        CloseHandle(WriteOverLap.hEvent);
        result:=8;
        exit;
      end;
    end
    else begin
    Dec(NumberOfBytesToWrite,NumberOfBytesWritten);
    Inc(WhereToStartWriting,NumberOfBytesWritten);
    end;
  end;//EndWhile
  CloseHandle(WriteOverLap.hEvent);
  result:=0;
end;

解决方案 »

  1.   

    你用的是文件句柄,我没有用过,我是用的控件来实现的。spcomm控件很方便。
      

  2.   

    我用过的方法
    VAR
    hcm:Thandle;
      hdcb:TDCB;
      num:DWORD;
      p:pchar;
      i:integer;
      s:string;
      m_length:integer;
    begin
      getmem(p,25);  
      s:=edit2.Text;
      m_length:=length(s);
      strcopy(p,pchar(s));
      hcm := CreateFile('com1',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);
        if hcm<>0 then
        begin
          try
            zeromemory(@hdcb,sizeof(TDCB));
            hdcb.DCBlength := sizeof(TDCB);
            hdcb.BaudRate  := 19200;
            hdcb.ByteSize  := 8;
            hdcb.Parity    := NOParity;
            hdcb.StopBits  := ONESTOPBIT;        
            if (SetCommState(hcm,hdcb)) then
            begin
              FOR I:=0 TO M_LENGTH-1 DO
              begin
               sleep(1);
               WriteFile(hcm,p[I],1,num,nil);           
              end;           
            end;
          finally
            CloseHandle(hcm);
          end;
          freemem(p,25);
    end;
      

  3.   

    我知道错在什么地方了,呵呵!把中间一段的else begin去掉就ok了
    if not WriteFile(CommHandle,OutBuf [WhereToStartWriting],NumberOfBytesToWrite,NumberOfBytesWritten,@WriteOverlap) then
        begin
          if (GetLastError=ERROR_IO_PENDING) then
          begin
            WaitForSingleObject(WriteOverlap.hEvent,INFINITE);
            GetOverlappedResult(CommHandle,WriteOverlap,NumberOfBytesWritten,False);
          end
          else begin
            {Write error}
            CloseHandle(WriteOverLap.hEvent);
            result:=8;
            exit;
          end;
        end;
        Dec(NumberOfBytesToWrite,NumberOfBytesWritten);
        Inc(WhereToStartWriting,NumberOfBytesWritten);