?? uscontrol.~pas
字號:
Result := -1;
break;
end;
for i:=1 to iReadNum do //字節讀取到后串口緩沖自動清空
begin
RetStr := RetStr + buffer[i]; //將讀取到的字節添加到讀到字節緩沖區
end;
iTotalNum := iTotalNum + iReadNum;
if iTotalNum >= NumberOfBytesToRead then //如果讀取到的字節數大于等于需要讀取數返回
begin
TotalBytes := iTotalNum;
Break;
end;
crTimer := GetTickCount;
if ((crTimer - dwTimer) > Timeout) or ((crTimer < dwTimer) and
(crTimer+(4294967295-dwTimer) > Timeout)) then //超時返回
begin
TotalBytes := iTotalNum;
Result:=-2;
Break;
end;
end;
end;
///////////////////////////////////
//發送指定字節數的數據到串口
//返回: 0表示成功,
// -1表示錯誤,
//////////////////////////////////
function TSerialControl.WriteCom(var SendStr:string; //要發送字節緩沖區
NumberofBytesToWrite:DWord; //要發送的字節數
PurgeFlag:Boolean=FALSE; //是否先清緩沖區
TimeOut:DWord=1000 //超時
):Integer;
var
i:integer;
iWritedNum:DWord;
buffer:array[1..500] of char;
begin
if NumberofBytesToWrite = 0 then
begin
NumberofBytesToWrite := Length(SendStr);
end;
for i:=1 to NumberofBytesToWrite do
begin
//buffer[i] := Chr(StrToAsc(Copy(SendStr,i,1)));
buffer[i] := Chr(ord(SendStr[i]));
end;
if PurgeFlag then
begin
PurgeComm(m_hComm,PURGE_TXCLEAR or PURGE_TXABORT); //清除數據緩沖區
end;
WriteFile(m_hComm, //操作句柄
buffer, //數據緩沖區
NumberOfBytesToWrite, //要寫入的字節長度
iWritedNum, //實際寫入的字節長度
nil); //overlapped buffer
if iWritedNum = NumberOfBytesToWrite then //如果字節全部寫入
begin
Result:=0;
end else
begin
Result:=-1;
end;
end;
///////////////////////////////////
//清發送和接收緩沖區
//////////////////////////////////
procedure TSerialControl.purgeReadWrite(RWFlag:Integer);
begin
if RWFlag=0 then
begin
PurgeComm(m_hComm, PURGE_RXCLEAR or PURGE_RXABORT);
end else
begin
PurgeComm(m_hComm,PURGE_TXCLEAR or PURGE_TXABORT);
end;
end;
///////////////////////////////////
//com pin 4 dtr
///////////////////////////////////
procedure TSerialControl.SetDTR(Status:Boolean);
var
com_dcb:DCB ;
begin
GetCommState(m_hComm, com_dcb);
com_dcb.Flags:=Com_dcb.Flags and (not($03*DTRBit));
if Status then
begin
com_dcb.Flags:=Com_dcb.Flags or (DTR_CONTROL_ENABLE*DTRBit);
end else
begin
Com_Dcb.Flags:=Com_Dcb.Flags or (DTR_CONTROL_DISABLE*DTRBit);
end;
SetCommState(m_hcomm, com_dcb);
end;
///////////////////////////////////
//com pin 7 rts
///////////////////////////////////
procedure TSerialControl.SetRTS(Status:Boolean);
var
com_dcb:DCB ;
begin
GetCommState(m_hComm, com_dcb);
com_dcb.Flags:=Com_dcb.Flags and (not($03*RTSBit));
if Status then
begin
com_dcb.Flags:=Com_dcb.Flags or (RTS_CONTROL_ENABLE*RTSBit);
end else
begin
Com_Dcb.Flags:=Com_Dcb.Flags or (RTS_CONTROL_DISABLE*RTSBit);
end;
SetCommState(m_hcomm, com_dcb);
end;
///////////////////////////////////
//
///////////////////////////////////
procedure TSerialControl.GetCtsDsr(var CTSStatus,DSRStatus:Boolean);
var
dwStatus:DWord;
begin
GetCommModemStatus(m_hComm,dwStatus);
if (dwStatus and MS_CTS_ON)>0 then
begin
CTSStatus:=True;
end else
begin
CTSStatus:=FALSE;
end;
if (dwStatus and MS_DSR_ON)>0 then
begin
DsrStatus:=True;
end else
begin
DsrStatus:=FALSE;
end;
end;
///////////////////////////////////
//
///////////////////////////////////
function TSerialControl.WaitForCTSDSR(var CTSStatus,DSRStatus:Boolean):Boolean;
var dwMask,dwStatus:DWord;
bRet:Boolean;
begin
SetCommMask(m_hComm,EV_CTS and EV_DSR);
bRet:=FALSE;
WaitCommEvent(m_hComm,dwMask,nil);
if (dwMask and EV_CTS)<>0 then
begin
GetCommModemStatus(m_hComm,dwStatus);
if (dwStatus and MS_CTS_ON)<>0 then
begin
CTSStatus:=True;
end else
begin
CTSStatus:=FALSE;
end;
bRet:=True;
end;
if (dwMask and EV_DSR)<>0 then
begin
GetCommModemStatus(m_hComm,dwStatus);
if (dwStatus and MS_CTS_ON)<>0 then
begin
DSRStatus:=True;
end else
begin
DSRStatus:=FALSE;
end;
bRet:=True;
end;
{MS_CTS_ON CTS為ON
MS_DSR_ON DSR為ON
MS_RING_ON RING為ON
MS_ELSD_ON RLSD為ON}
Result:=bRet;
end;
function StrToAsc(mstr:string):integer; //返回字符的ASC值
begin
Result := 126 - CompareStr('~',mstr);
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -