// 发送短消息
Var
  Len,len2: integer;
  eBuf:array[0..65535] of char;
  eBuf2:array[0..1] of char;
begin
 Len:=RichEdit1.GetTextBuf(eBuf,sizeof(eBuf));
 if len =0 then exit;
 BlinkSerialComm.SetRTSLineStatus(RTS_CONTROL_ENABLE);    // RTS 请求
 StrPcopy(@eBuf[Len], 'edit.txt'+#0);
 StrPcopy(@eBuf[Len+8],Format('%06d',[len]));
 len:=len;    
 ebuf2[0]:= '$';
 ebuf2[1]:= '1';
 len2:=2;
 BlinkSerialComm.SendData(eBuf2, len2);
 BlinkSerialComm.SendData(eBuf, Len);
 Sleep(1500);
 BlinkSerialComm.SetRTSLineStatus(RTS_CONTROL_DISABLE);    // RTS 请求
 MessageDlg('Transfer ok!', mtInformation, [mbOK], 0);//////////////////////////////////////////////////////////////////
// 设置RTS状态
procedure TBlinkCommunication.SetRTSLineStatus(RTSStatus: Integer);
var
  comdcb: TDCB;
  cFlags: Cardinal;
  CommStatus: TCommStatus;
  i: Integer;
begin
  if SystemOptionData.FlowControl=1 then  // RTS/CTS
    begin
      GetCommState(handle_of_com, comDCB);
      cFlags:=comDCB.Flags;
      comDCB.Flags:=LongInt((cFlags and $ffffcfff) or (RTSBits[RTSStatus]));  // 设置RTS
      if RTSStatus=RTS_CONTROL_DISABLE then
        CommonData.DelayMillisecond(12);
      SetCommState(handle_of_com, comDCB);
      if RTSStatus=RTS_CONTROL_ENABLE then
        begin
          for i:=0 to 500 do
            begin
              CommonData.DelayMillisecond(2);
              GetCurrentCommRSStatus(CommStatus);
              if CommStatus.rCTS=False then           // CTS 有效,退出
                Break;
            end;
        end
      else
        CommonData.DelayMillisecond(1);
    end;
end;///////////////////////////////////////////////////////////////////
//发送数据
Function TBlinkCommunication.SendData(var send_buffer: array of Char; var SendLen: Integer):BOOL;
var
  read_os: TOVERLAPPED;
  fWriteState: BOOL;
  sLen: DWORD;
  CommStatus: TCommStatus;
begin
  GetCurrentCommRSStatus(CommStatus);
  if CommStatus.rCTS=True then           // CTS 无效,请求CTS
    SetRTSLineStatus(RTS_CONTROL_ENABLE);    // 设置RTS
  if CommStatus.rcbOutQue>0 then
    begin
       Result:=False;
       Exit;
    end;
  read_os.Internal:=0;
  read_os.InternalHigh:=0;
  read_os.Offset:=0;
  read_os.OffsetHigh:=0;
  read_os.hEvent:=CreateEvent(nil, TRUE, FALSE, nil);  // 异步I/O
  fWriteState:=WriteFile(handle_of_com, Send_buffer, SendLen, sLen, @read_os);
  if not fWriteState then
  begin
    SerialCommState:=fWriteState;
    Result:=False;
  end
  else
    Result:=True;
end;
///////////////////////////////////////////////////////////
// 接收数据
Function TBlinkCommunication.ReceiveByte(var read_buffer: array of Char; var ReceLen: DWORD):BOOL;
var
  read_os: TOVERLAPPED;
  fReadState: BOOL;
  dwErrorFlags: DWORD;
  comComStat: TCOMSTAT;
  rLen: DWORD;
begin
  read_os.Internal:=0;
  read_os.InternalHigh:=0;
  read_os.Offset:=0;
  read_os.OffsetHigh:=0;
  read_os.hEvent:=CreateEvent(nil, TRUE, FALSE, nil);  // 异步I/O
  ClearCommError(handle_of_com, dwErrorFlags, @comComStat);
  ReceLen:=comComStat.cbInQue;
  if ReceLen>0 then
    begin
      if ReceLen>ReceiveBufferSize then
        ReceLen:=ReceiveBufferSize-1;
      fReadState:=ReadFile(handle_of_com, read_buffer, 1, rLen, @read_os);
      if not fReadState then
      begin
        SerialCommState:=fReadState;
        Result:=False;
      end else begin
        ReceLen:=Integer(rLen);
        Result:=True;
      end;
    end else
        Result:=False;
end;///////////////////////////////////////////////////////////////////////
//接收数据:文件和短消息
procedure TBlinkReceiveFileDlg.BlinkReceiveTimerTimer(Sender: TObject);
Var
  i,k,Len,rLen:DWORD;
  rbuf: array [0..ReceiveBufferSize-1] of AnsiChar; // ReceiveBufferSize=40960; // 串行接收缓冲区
  fName,s,rs: String;
  j : Integer;
begin
  if (sync_flag=0) then
    begin
      BlinkSerialComm.ReceiveByte(rbuf, rLen);
      if (rLen>0) and  (rbuf[0]=ansichar('$')) then
        begin
          BlinkSerialComm.ReceiveByte(rbuf, rLen);
          if (rLen>0) and  (rbuf[0]=ansichar('1')) then
            begin
              sync_flag:=1;
              checkbox1.Checked :=true;
            end;
          if (rLen>0) and  (rbuf[0]=ansichar('2')) then
            begin
              sync_flag:=2;
              RenLen := 0 ;
              checkbox1.Checked :=false;
            end;
        end;
    end
  else  // sync_flag <> 0
    begin
      BlinkSerialComm.ReceiveData(rbuf, rLen);
      if (rLen>0) then
        begin
          label11.Caption := inttostr(tst2);
          TransferFlag:=True;
          WaitNum:=0;
          if OptionRadioGroup.ItemIndex=1 then
             begin
               for i:=0 to rLen-1 do
                 rBuf[i]:=AnsiChar(Byte(rBuf[i]) xor $a5);     // 简单解密
             end;
          k:=0;
          while (k<rLen) and (RenLen<BlinkBufferSize)do // BlinkBufferSize=2097152
             begin
               rBuffer[RenLen]:=rBuf[k];
               Inc(k);
               Inc(RenLen);
             end;          if (sync_flag=2) then
            begin
              if RenLen >=9 then
                begin
                  Len:=StrToInt(AnsiString(@rBuffer[0]));                  ReceiveShape.Brush.Color :=clNavy;
                  ReceiveLabel.Font.Color :=clNavy;                  ReceiveTotalBytesEdit.Text :=rBuffer;
                  fName:=CommonData.ExtractPcharString(rBuffer,7,128);
                  fname :=ExtractFileName(fname);
                  ReceiveFileNameEdit.Text := fname;
                  ReceivedBytesEdit.Text :=IntToStr(RenLen-8-length(fname));
                  ReceiveProgressBar.Max := Len;
                  ReceiveProgressBar.Position := RenLen;  // RenLen 为已接收长度
                end;
            end;
        end // rLen>0 结束
      else if TransferFlag then  // rLen <=0
        begin
          if  (not CD_on()) then
            WaitNum:=WaitNum+1;
          if (WaitNum=3) then
            begin
              Len:=StrToInt(AnsiString(@rBuffer[0]));
              fName:=CommonData.ExtractPcharString(rBuffer,7,128);
              fname :=ExtractFileName(fname);
              if (Len <= RenLen-8-length(fname)) then
                begin  
                  TransferFlag:=False;
                  WaitNum:=0;             
                  if (sync_flag=2) then
                     begin
                       SaveFileAuto;
                       //sync_flag:=0;
                     end;
                  sync_flag:=0;
                end;
            end;
        end; // end of trans flag
    end;
end;//////////////////////////////////////////////////////////
// 这个好像是显示短消息用的。我判断的
procedure TBlinkReceiveFileDlg.Timer1Timer(Sender: TObject);
var
  sbuf: array [0..64] of AnsiChar;
  ShowLen:integer;
begin
  if showcount>=RenLen then exit;  // RenLen 为已接收长度
  ShowLen:=0;
  while (ShowLen<64) and (showcount<RenLen) do
    Begin
       case rBuffer[showcount] of
         char(0)..char(09),char(11)..char(12),char(14)..char(31),char(127):
                sbuf[ShowLen]:=char(32);
         else   sbuf[ShowLen]:=rBuffer[showcount];
       end;
       inc(showcount);
       inc(ShowLen);
    End;  sbuf[ShowLen]:=char(0);
  if CheckBox1.Checked = true  then
    with ReceiveTextRichEdit do // 接收到的短消息显示在ReceiveTextRichEdit里面
      begin
        selStart:=ShowCount;
        SetSelTextBuf(@SBuf);
      end;
end;//////////////////////////////////////////////////////我正在改别人的一个有关数据传输的软件(原来的软件本来就有问题),但是至今还有问题,确切地说是不稳定的。发送文件没有问题,
主要是发送短消息的问题,具体说有两个:1 :有时能收到,有时收不到;2 : 经常会弹出Access violation
而程序提示出错的代码是这一行:MessageDlg('Transfer ok!', mtInformation, [mbOK], 0);
我实在是百思不得其解,还望各位赐教,我已经被它折磨了大半年了。代码有点多,不好意思。实在对不起,小弟没分了,以后一定补上.