📄 75146.htm
字号:
<TR>
<TD align=middle bgColor=#003399 height=16><FONT
color=#ffffff>出处</FONT></TD>
<TD> <SPAN
id=ArticleTitle1_ArticleTitle1_lblSource></SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD width=10></TD>
<TD><SPAN id=ArticleContent1_ArticleContent1_lblContent>
<P>应为工作需要自己编写的RS232通讯模块,该模块已经编写了蛮久,在实际使用中可能有没有考虑和不完善的地方。</P>
<P>//=================================================================================</P>
<P>//如果使用该模块请保留该注释,如果被修改或编辑请将修改后的代码发送一份给我</P>
<P>//编写:戴琪英</P>
<P>//E_Mail:qiyingdai@163.com</P>
<P>//2000-09-01</P>
<P>//=================================================================================</P>
<P>unit R232Comm;</P>
<P>interface<BR>uses<BR> Windows,SysUtils;<BR>const<BR>
INITR12COMM_SUCCESS=0;<BR>
INITR12COMM_FAILURE=-1;<BR>var<BR>
bSendFinish:boolean=True;//发送完标志<BR>
iRecvLen:DWORD=0;<BR> RecvBuff,TempBuff:PChar;<BR>
SendCommand,RecvCommand:String;//发送和接收到的命令<BR>
RecvFinish:BOOL=False;<BR> RecvBuffInit:BOOL=False;<BR>
SendCommandSuccess:BOOL; //切换台命令被成功发送标志</P>
<P>function InitR12CommDev(comNo:PChar):String;
//初始化切换台串口,返回状态字符<BR>procedure
SwitchR12(WriteBuffer:PChar);//对切换台进行切换函数<BR>procedure
SwitchR12Byte(WriteBuffer:Byte);<BR>procedure
CommSendNotify;//串口接收到字符事件响应过程<BR>procedure CommRecvNotify;
//串口发送缓冲区空事件响应过程<BR>procedure CommWatchThread(var
lpdwParam:DWORD);//通信口监视线程<BR>function ConInfo :String;</P>
<P>implementation<BR>var<BR>
//comMask,comBuf,ComState:Integer;<BR> dcb:_DCB;
//DCB结构用于配置串口,程序中涉及各域含义如下:<BR>
//DWORD DCBlength
:DCB结构大小<BR>
//DWORD BaudRate :
波特率<BR>
//DWORD fBinary : 1
二进制模式<BR>
//DWORD fParity : 1
进行奇偶校验<BR>
//BYTE ByteSize: 字符位数
4~8<BR>
//BYTE Parity: 奇偶校验位
0-4分别表示无、奇、偶、传号、空号校验<BR>
//BYTE StopBits: 停止位数 0-2分别表示
1、1.5、2个停止位<BR>
//WORD XonLim :XON
阈值<BR>
//WORD XoffLim XOFF
阈值<BR>
//char XonChar: XON
字符<BR>
//char XoffChar: XOFF
字符<BR>
//char EvtChar: 事件字符<BR> comStat:_COMSTAT;
//COMSTAT结构用于存放有关通信设备的当前信息<BR>
//程序中涉及各域含义如下:<BR>
//cbInQue
:接收缓冲区中字符个数<BR>
//cbOutQue:发送缓冲区中字符个数<BR> dwErrorFlag:LongWord;<BR>
hCommDev,comThreadHwnd:Thandle;//通信串口句柄和通信监视线程句柄<BR>
comMask,comBuf,comState:BOOL;<BR>
read_os,write_os:_OVERLAPPED; //OVERLAPPED
结构,用于异步操作的Win32函数中<BR>
//程序中涉及各域含义如下:<BR>
//DWORD Interval
保留给操作系统使用<BR>
//DWORD IntervalHigh
保留给操作系统使用<BR>
//DOWD hEvent
当I/O操作完成时被设置为有信号状态<BR>
//的事件;当调用ReadFile和WriteFile函数之前,调<BR>
//用进程设置该事件<BR>
postRecvEvent,postSendEvent:Thandle;//发送缓冲区空和接收到字符事件句柄<BR>
dwThreadID1:DWORD; //通信监视线程ID号</P>
<P>///串口初始化函数<BR>//该函数主要完成串口初始化设置和通信线程的启动<BR>//入口参数:串口号<BR>//返回值;初始化是否成功的状态字符<BR>function
InitR12CommDev(comNo:PChar) :String;<BR>begin<BR>
///打开串口<BR> hCommDev:=CreateFile(comNo,
//串口好<BR>
GENERIC_READ or
GENERIC_WRITE,//对串口以读写方式打开<BR>
0,<BR>
nil,<BR>
OPEN_EXISTING,<BR>
FILE_ATTRIBUTE_NORMAL or
FILE_FLAG_OVERLAPPED,//允许重叠操作<BR>
0<BR>
);<BR> if hCommDev=INVALID_HANDLE_VALUE
then<BR>
InitR12CommDev:='切换台通讯端口初始化失败.'<BR>
else<BR>
InitR12CommDev:='切换台通讯端口初始化成功.';<BR>
comMask:=SetCommMask(hCommDev,EV_RXFLAG);//设置事件掩码<BR>
//comBuf:=SetupComm(hCommDev,4096,4096);//设置接收和发送缓冲区大小皆为4096字节<BR>
comBuf:=SetupComm(hCommDev,1,1);//设置接收和发送缓冲区大小皆为4096字节<BR>
if comBuf=False
then<BR>
InitR12CommDev:='切换台通讯端口初始化失败.'<BR>
else<BR>
begin<BR>
InitR12CommDev:='切换台通讯端口初始化成功.';<BR>
//清空缓冲区<BR>
PurgeComm(hCommDev,PURGE_TXABORT or PURGE_RXABORT
or<BR>
PURGE_TXCLEAR or PURGE_RXCLEAR ) ;<BR>
end;</P>
<P> //以下对串口进行配置<BR>
dcb.DCBlength:=sizeof(_DCB);<BR>
comState:=GetCommState(hCOmmDev,dcb); //得到缺省设置<BR>
if comState=False
then<BR>
InitR12CommDev:='切换台通讯端口初始化失败.'<BR>
else<BR>
InitR12CommDev:='切换台通讯端口初始化成功.';<BR>
dcb.BaudRate:=9600; //波特率 9600<BR>
dcb.ByteSize:=8;//7; //数据长度7位<BR>
dcb.Parity:=NOPARITY;//ODDPARITY; //校验方式 奇校验<BR>
dcb.StopBits:=ONESTOPBIT; //停止位 1 位</P>
<P> dcb.Flags :=
0; // Enable
fBinary<BR> dcb.Flags := dcb.Flags or
2; // Enable
parity check<BR> dcb.XonChar:= chr($00)
;<BR> dcb.XoffChar:= chr($00) ;<BR>
dcb.XonLim:= 100 ;<BR> dcb.XoffLim:= 100
;<BR> dcb.EvtChar := Char($ff);</P>
<P> comState:=SetCommState(hCommDev,dcb);
//设置串口<BR> if comState=False
then<BR>
InitR12CommDev:='切换台通讯端口初始化失败.'<BR>
else<BR>
InitR12CommDev:='切换台通讯端口初始化成功.';<BR>
//设置通信接收到字符事件句柄<BR>
postRecvEvent:=CreateEvent(NIL,<BR>
TRUE,//手工重置事件<BR>
TRUE,
//初始化为有信号状态<BR>
NIL<BR>
);<BR> //设置读异步I/O操作事件句柄<BR>
read_os.hEvent:=CreateEvent(NIL,<BR>
TRUE,//手工重置事件<BR>
FALSE,
//初始化为无信号状态<BR>
NIL<BR>
);<BR> //设置发送缓冲区空事件句柄<BR>
postSendEvent:=CreateEvent(NIL,<BR>
TRUE,//手工重置事件<BR>
TRUE,
//初始化为有信号状态<BR>
NIL);<BR> //设置写异步I/O操作事件句柄<BR>
write_os.hEvent:=CreateEvent(NIL,<BR>
TRUE,//手工重置事件<BR>
FALSE,//初始化为无信号状态<BR>
NIL);<BR> //创建通信监视线程<BR>
comThreadHwnd:=CreateThread(NIL,<BR>
0,<BR>
@CommWatchThread,
//通信线程函数的地址<BR>
nil,<BR>
0,
//创建后立即运行<BR>
dwThreadID1);//通信线程ID号<BR> if
comThreadHwnd=INVALID_HANDLE_VALUE
then<BR>
InitR12CommDev:='INITR12COMM_FAILURE'<BR>
else<BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -