📄 uscontrol.pas
字号:
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 else
begin
sleep(1);
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 + -