串口通信控件主要属性小结◆CommPort属性MSComm1.CommPort=2◆Settings属性MSComm1.Settings=“1200,e,8,1“◆PortOpen属性MSComm1.PortOpen=True◆OutPut属性MSComm1.OutPut=Text1.text◆Input属性Text1=MSComm1.Input◆InBufferCount属性◆RThreshold属性串口通信的基本步骤◆在工程中添加MSComm控件;◆设置CommPort属性选择通信串口;◆设置Settings属性选择通信参数;◆设置PortOpen=True打开通信串口;◆使用Output属性发送数据;◆使用Input属性接收数据;◆设置PortOpen属性=False关闭串口。1.3.2自动接收数据自动接收数据的方法通常有两种:1.查询方式MSComm1控件的InBnfferCount属性用来返回接收缓冲区中已收到但还未取走的字符个数,可以通过查询InBnfferCount属性值是否大于0来判断是否有数据接收进来。查询的方法可以借助定时器(Timer1)控件。(1)窗体设计:在简单串口通信窗体设计中,将“接收”按钮及相应的代码去掉,并在窗体中添加一个定时器控件。(2)属性设置:定时器控件的Enabled属性设置为Ture,Interval属性取值为100。查询方式下串口通信窗体设计(3)编写代码用鼠标双击定时器控件在Timer1_Timer事件中加入以下代码:PrivateSubTimer1_Timer()IfMSComm1.InBufferCount0Thentimel=TimerWhileTimer-timel0.1DoEventsWendText2.Text=MSComm1.InputEndIfEndSub运行程序,在发送文本框中输入字符或汉字,点击“发送”按钮,在“接收”文本框中就会自动显示接收到的数据。2.事件驱动方式事件驱动方式使用串口控件的OnComm事件。由于事件驱动方式会产生类似于硬件中断的效果,所以也称为软中断接收方式。OnComm事件MSComm1控件只有一个OnComm事件,在这个事件中包含了十七个通信过程中的事件处理过程并用事件用属性CommEvent的十七个值来区分不同的触发事件。无论何时当CommEvent属性值变化时,就产生OnComm事件。(1)CommEvent属性取值及含义◆通信错误常数(共计10个)符号常数值含义comEventBreak1001接收到中断信号comEventCTSTO1002CTS超时comEventDSRTO1003DSR超时comEventFrame1004帧错误comEventOverrun1006数据丢失(端口超速)comEventCDTO1007CD超时comEventRxOver1008接收缓冲区溢出comEventRxParity1009极性错误comEventTxFull1010发送缓冲区满comEventDCB1011检索端口设备控制块(DCB)时的意外错误◆管脚状态及接收/发送缓冲区状态等常数(共计7个)。符号常数值含义comEvSend1发送缓冲区有Sthreshold属性设置的字符数comEvReceive2接收缓冲区有RThreshold属性设置的字符数comEvCTS3CTS线状态发生变化comEvDSR4DSR线状态发生变化comEvCD5CD线状态发生变化comEvRing6RI(振铃)线状态变化comEvEOF7输入数据流中发现文件结束标志(EOF)(2)OnComm事件示例框架代码PrivateSubMSComm1_OnComm()SelectCaseMSComm1.CommEventCasecomEventBreak‘十个错误CasecomEventCDTOCasecomEventCTSTOCasecomEventDSRTOCasecomEventFrameCasecomEventOverrunCasecomEventRxOverCasecomEventRxParityCasecomEventTxFullCasecomEventDCBCasecomEvCD’七个事件CasecomEvCTSCasecomEvDSRCasecomEvRingCasecomEvReceive‘接收缓冲区有Rthreshold属性设置的字符数(2),此处放接收数据代码。CasecomEvSendCasecomEvEOFEndSelectEndSub(3)编写事件驱动方式的通信程序◆窗体设计:在查询方式通信窗体中,将定时器控件及相关的代码去掉。◆编写代码PrivateSubMSComm1_OnComm()SelectCaseMSComm1.CommEventCasecomEvReceiveMSComm1.RThreshold=0IfMSComm1.InBufferCount0Thentimel=TimerWhileTimer-timel0.1DoEventsWendText2.Text=MSComm1.InputEndIfMSComm1.RThreshold=1EndSelectEndSubPrivateSubForm_Load()MSComm1.RThreshold=1MSComm1.PortOpen=TrueEndSub◆运行程序:在发送文本框中输入数据后,点击发送按钮,在接收文本框中就会自动显示接收到的数据。1.3.3用Modem进行远程通信1.AT指令简介PC机串口通信中,计算机一端称为数据终端设备(DTE),调制解调器一端称为数据通信设备(DCE),PC机串行通信的硬件连接方式分为零Modem连接和Modem连接。◆零Modem连接:直接用电缆将两台PC机连接起来的方式。◆Modem连接:通过Modem及电话网将两台PC机连接起来的方式。Modem工作有命令和在线两种状态◆命令状态是指通信线路上的两个Modem还没有建立起连接的状态。处于命令状态下的Modem会把PC机发往串口的信息当成指令来执行。因此,在命令状态下,PC机可通过串口向调制解调器发送指令对其进行初始化、设置和操作。◆在线状态是指通信线路上的两个Modem建立起连接后的状态。使用AT指令要遵循的规则◆每个AT指令字符串的最后必须加上回车符Chr(13),否则调制解调器将不执行传送过来的指令。◆除了“A/”和“+++”两个指令外,其他的指令都必须加上“AT”前导符。◆AT指令可以一个一个地发送,也可以合成一个字符串后再发送。用字符串发送时,总长度不能超过40个字符。◆所有的AT指令字符必须一律是大写或小写。AT指令应用举例◆对Modem初始化:MSComm1.Output=“ATE0Q1M0S0=5”&Chr(13),表示不回应指令、不返回结果码、关闭扬声器、振铃响5次后摘机。◆拨号:MSComm1.Output=ATDT&Text1.Text&Chr(13)◆摘机:MSComm1.Output=ATH1&Chr(13)◆挂机:MSComm1.Output=+++,ATH0&Chr(13)2.远程通信编程举例(1)硬件连接:用Modem进行两台计算机间的远程通信,需要两个Modem和两条不同号码的电话线。可以使用一台计算机模拟远程通信,方法是将接有电话线的两个Modem分别接在计算机的两个串口上,通信时只要对两个串口进行读写操作即可。如果Modem具有专线功能可以用一条两端带有RJ-11插头的两芯电话线将两个调制解调器直接连接起来进行通信。(2)设计窗体:在事件驱动方式串口通信窗体上添加一个标签(Label3)和文本框(Text3)。标签的Caption属性设置为“电话号码”,文本框用来输入电话号码。(3)编写代码用Modem实现远程通信完整代码如下:DimtimelPrivateSubCommand1_Click()MSComm1.Output=_ATDT&Text3.Text&Chr(13)timel=TimerDoWhileTimer-timel30DoEventsIfMSComm1.CDHoldingThen_GoToCD_TureLoopMsgBox“未检测到载波信号”MSComm1.Output=_+++,ATH0&Chr(13)ExitSubCD_Ture:MSComm1.Output=Text1.TextEndSubPrivateSubForm_Load()MSComm1.RThreshold=1MSComm1.PortOpen=TrueMSComm1.DTREnable=TrueMSComm1.Output=_ATE0Q1M2S0=1&Chr(13)EndSubPrivateSubMSComm1_OnComm()SelectCaseMSComm1.CommEventCasecomEvReceiveMSComm1.RThreshold=0IfMSComm1.InBufferCount0Then‘此处加延时0.1秒程序代码Text2.Text=MSComm1.InputMSComm1.Output=_+++,ATH0&Chr(13)EndIfMSComm1.RThreshold=1EndSelectEndSub(4)运行程序