// 发送短消息
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);
我实在是百思不得其解,还望各位赐教,我已经被它折磨了大半年了。代码有点多,不好意思。实在对不起,小弟没分了,以后一定补上.
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);
我实在是百思不得其解,还望各位赐教,我已经被它折磨了大半年了。代码有点多,不好意思。实在对不起,小弟没分了,以后一定补上.
应该不至于吧?