📄 75146.htm
字号:
InitR12CommDev:='切换台通讯端口初始化成功.';<BR>end;</P>
<P>///切换台切换控制函数<BR>///输入参数;切换命令字符串<BR>procedure
SwitchR12(WriteBuffer:PChar);<BR>var<BR> dwWriteByte,TxCount:DWORD;<BR> bl:BOOL;<BR> dwError:DWORD;</P>
<P>begin<BR>
//WriteBuffer:=chr($0D)+'03A00';<BR>
TxCount:=StrLen(WriteBuffer);<BR> if
bSendFinish=True then //发送缓冲区空发送<BR>
begin<BR>
dwWriteByte:=0;<BR>
bSendFinish:=False;<BR>
bl:=WriteFile(hCommDev,Byte(WriteBuffer^),TxCount,dwWriteByte,@write_os);<BR>
if bl=True then<BR>
begin<BR>
bSendFinish:=True;<BR>
PurgeComm(hCommDev,PURGE_TXCLEAR
);//如果发送完成,置缓冲区空标志,并清空缓冲区<BR>
end;<BR> if bl=False
then<BR>
begin<BR>
dwError:=GetLastError();<BR>
if (dwError=ERROR_IO_PENDING) or (dwError=ERROR_IO_INCOMPLETE)
then<BR>
begin<BR>
bl:=GetOverLappedResult(hCommDev,<BR>
write_os,dwWriteByte,TRUE);//如果未发送完命令字符<BR>
//等待发送完成<BR>
if bl=True
then<BR>
begin<BR>
bSendFinish:=True;<BR>
PurgeComm(hCommDev,PURGE_TXCLEAR ); //发送完成
置缓冲区空标志,并清空缓冲区<BR>
//Result:=True;<BR>
end;<BR>
end;<BR>
end;<BR> end;<BR>
//Result:=True;<BR>end;</P>
<P>procedure
SwitchR12Byte(WriteBuffer:Byte);<BR>var<BR> dwWriteByte,TxCount:DWORD;<BR> bl:BOOL;<BR> dwError:DWORD;</P>
<P>begin<BR>
//WriteBuffer:=chr($0D)+'03A00';<BR>
TxCount:= 1 ;//StrLen(WriteBuffer);<BR> if
bSendFinish=True then //发送缓冲区空发送<BR>
begin<BR>
dwWriteByte:=0;<BR>
bSendFinish:=False;<BR>
bl:=WriteFile(hCommDev,WriteBuffer,TxCount,dwWriteByte,@write_os);<BR>
if bl=True then<BR>
begin<BR>
bSendFinish:=True;<BR>
PurgeComm(hCommDev,PURGE_TXCLEAR
);//如果发送完成,置缓冲区空标志,并清空缓冲区<BR>
end;<BR> if bl=False
then<BR>
begin<BR>
dwError:=GetLastError();<BR>
if (dwError=ERROR_IO_PENDING) or (dwError=ERROR_IO_INCOMPLETE)
then<BR>
begin<BR>
bl:=GetOverLappedResult(hCommDev,<BR>
write_os,dwWriteByte,TRUE);//如果未发送完命令字符<BR>
//等待发送完成<BR>
if bl=True
then<BR>
begin<BR>
bSendFinish:=True;<BR>
PurgeComm(hCommDev,PURGE_TXCLEAR ); //发送完成
置缓冲区空标志,并清空缓冲区<BR>
//Result:=True;<BR>
end;<BR>
end;<BR>
end;<BR> end;<BR>
//Result:=True;<BR>end;</P>
<P>////通信监视线程<BR>procedure CommWatchThread(var
lpdwParam:DWORD);<BR>var<BR>
dwTransfer,dwEvtMask,dwError:DWORD;<BR>
os:_OVERLAPPED;<BR> bl:boolean;</P>
<P>begin<BR>
os.hEvent:=CreateEvent(nil,<BR>
TRUE,<BR>
FALSE,<BR>
NIL);</P>
<P> comMask:=SetCommMask(hCommDev,EV_RXCHAR or
EV_TXEMPTY);//设置监视的事件为接<BR>
//收到字符或发送缓冲区空<BR> if comMask=True
then<BR>
begin<BR> while True
do<BR>
begin<BR>
dwEvtMask:=0;<BR>
bl:=WaitCommEvent(hCommDev,dwEvtMask,@os);
//查询所监视的通信事件是否<BR>
//已经发生<BR>
if bl=False
then<BR>
begin<BR>
dwError:=GetLastError();<BR>
if dwError=ERROR_IO_PENDING
then<BR>
GetOverlappedResult(hCOmmDev,os,dwTransfer,TRUE);//若未监测到通信事件<BR>
//则在此等待事件发生<BR>
end;<BR>
//有事件,进行如下处理<BR>
if (dwEvtMask and EV_RXCHAR)=EV_RXCHAR then //判断是否为接收到
字符事件<BR>
begin<BR>
WaitForSingleObject(postRecvEvent,$FFFFFFFF);//等待接收事件句柄为有<BR>
//信号状态<BR>
ResetEvent(postRecvEvent);
//置接收事件句柄为无信号状态,以免接收<BR>
//缓冲区被覆盖<BR>
CommRecvNotify;
//调用接收到字符处理函数<BR>
continue;
//处理完接收字符,继续监测通信事件<BR>
end;<BR>
if (dwEvtMask and EV_TXEMPTY)=EV_TXEMPTY then
//判断是否为发送缓冲区空事件<BR>
begin<BR>
WaitForSingleObject(postSendEvent,$FFFFFFFF);//等待发送事件句柄为有<BR>
//信号状态<BR>
ResetEvent(postSendEvent);
//置发送事件句柄为无信号状态,,以免发送<BR>
//缓冲区被覆盖<BR>
CommSendNotify;
//调用发送缓冲区空处理函数<BR>
continue;//处理完,继续监测通信事件<BR>
end;<BR>
end;<BR> end;<BR>
CloseHandle(os.hEvent);<BR>end;</P>
<P>//发送缓冲区空处理过程<BR>procedure
CommSendNotify;<BR>begin<BR>
SetEvent(postSendEvent);//置发送事件未有信号状态,以便进行下一次发送<BR>end;</P>
<P>///接收到字符处理函数<BR>procedure
CommRecvNotify;<BR>var<BR>
RxCount,dwReadByte:DWORD;<BR> inData
:Byte;<BR>begin<BR>
ClearCommError(hCommDev,dwErrorFlag,@ComStat);<BR>
RxCount:=ComStat.cbInQue; //获取接收缓冲区的字符个数<BR>
if RxCount>0 then<BR>
begin<BR> if not RecvBuffInit
then<BR>
begin<BR>
StrCopy(RecvBuff,'');<BR>
RecvBuffInit:=True;<BR>
end;<BR>
StrCopy(TempBuff,'');<BR>
ReadFile(hCommDev,Byte(TempBuff^),RxCount,dwReadByte,@read_os);//读字符存入<BR>
//临时缓冲区中<BR>
iRecvLen:=iRecvLen+dwReadByte; //接收到字符个数统计</P>
<P> if iRecvLen >=1
then<BR>
begin<BR>
inData :=
Byte(TempBuff^);<BR>
if inData = $D9
then<BR>
begin<BR>
SendCommandSuccess:=True;
//如果状态一致,则置该标志为真,标志切换成功<BR>
end<BR>
else<BR>
begin<BR>
SendCommandSuccess:=False;//否则,置该标志为假,表示切换失败<BR>
end;</P>
<P>
iRecvLen:=0;<BR>
StrCopy(RecvBuff,'');<BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -