⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m70.htm

📁 vb教程 vb教程 vb教程 vb教程 vb教程 vb教程 vb教程 vb教程 vb教程 vb教程 vb教程
💻 HTM
📖 第 1 页 / 共 2 页
字号:
          <br>
          四、串口查询法的程序实例<br>
          <br>
            现约定甲方是PC机,乙方是单片机系统(如电卡电度表系统的读卡器)。通信格式设置为2400波特率,8位数据位,1位停止位,无奇偶校验。<br>
          <br>
          下面是一个约定好通讯协议的程序实例,协议如下面流程图所示:<br>
          <br>
          以下是甲方(PC机)的几个子函数的程序实例。<br>
          Private Function OpenThePort(cPort as String,cBaud as String,cParity 
          as String,cData as String,tStops as String)As Boolean<br>
          Dim lResult as Long<br>
          Dim lHandle as Long<br>
          Dim DCB_COMM as DCB<br>
          Dim cDCBConfig as String<br>
          lHandle = CreateFile(cPort,GENERIC_READ Or GENERIC_WRITE,0&amp;,0&amp;,OPEN_EXISTING,0&amp;,0&amp;)<br>
          If lHandle = -1 Then ’打开串口失败<br>
          OpenThePort = False<br>
          MsgBox “串口可能正被其他应用程序占用!”<br>
          lResult = CloseHandle(lHandle) ’先关闭串口后再打开<br>
          If lResult = 0 Then<br>
          OpenThePort<br>
          Exit Function<br>
          End If<br>
          End If<br>
          cDCBConfig.band = 2400 ’设置DCB<br>
          cDCBConfig.parity = None<br>
          cDCBConfig.data = 8<br>
          cDCBConfig.stop = 1<br>
          lResult = BuildCommDCB(cDCBConfig,DCB_COMM) ’按用户设定配置一个DCB结构<br>
          If lResult = 0 Then<br>
          OpenThePort = False<br>
          MsgBox “无法建立DCB设备控制块”<br>
          Exit Function<br>
          End If<br>
          lResult = SetCommState(lHandle,DCB_Comm) ’实际设置一个串口的DCB<br>
          If lResult = 0 Then<br>
          OpenThePort = False<br>
          MsgBox “无法建立DCB设备控制块”<br>
          Exit Function<br>
          End If<br>
          OpenThePort = True<br>
          End Function<br>
          <br>
          Private Sub SendHand ( ) ’发送握手信号的子过程<br>
          Dim Nchars As Long<br>
          Static Readbuff As String * 1<br>
          Static Writebuff As String * 1<br>
          Dim lpDCB As DCB<br>
          Dim lRet As Long<br>
          Dim lHandle As Long<br>
          Dim lpOverlapped As OVERLAPPED<br>
          Dim RNum As Integer<br>
          <br>
          MsgBox “请把电卡读卡器插在串口2上!”,48,“提示窗口”<br>
          lHandle = OpenThePort(COMM1,2400,None,8,1)<br>
          lRet = PurgeComm( lHandle,1 ) ’清输出缓冲区<br>
          lRet = PurgeComm( lHandle,0 ) ’清输入缓冲区<br>
          lRet = GetCommState ( lHandle,lpDCB ) ’获得通讯口的状态<br>
          Shand:<br>
          Writebuff$ = Chr$(&amp;H8F)<br>
          lRet = WriteFile ( lHandle,Writebuff$,1,Nchars,lpOverlapped ) ’送握手信号入串口缓冲区<br>
          If lRet &lt;= 0 Then<br>
          MsgBox “发送操作出错,电卡握手信号未发送成功”, 16<br>
          GoTo Shand ’不成功则重发<br>
          Else<br>
          GoTo Qtest<br>
          End If<br>
          GoTo Shand<br>
          Qtest:<br>
          Readbuff$ =“ ” ’清除缓冲区为空<br>
          Do While lHandle ’循环查询串口<br>
          RNum = 0 ’设置读串口次数的指针为0<br>
          ReadAgain:<br>
          lRet = ReadFile( lHandle,Readbuff$,1,Nchars,lpOverlapped )<br>
          If lRet &lt; 0 Then<br>
          MsgBox “读取应答信号时出错”, 16<br>
          End If<br>
          If lRet = 0 Then<br>
          If RNum &gt; 1000 Then ’只读1000次串口,以免陷入死循环<br>
          MsgBox "电卡没有插接好或电卡没有接在串口上!"<br>
          GoTo CloseP<br>
          End If<br>
          RNum = RNum + 1<br>
          GoTo ReadAgain<br>
          End If<br>
          If Hex$(Asc(Readbuff)) &lt;&gt; Hex$(&amp;HFF) Then<br>
          GoTo Shand ’回送码不正确则返回继续发送握手信号<br>
          Else<br>
          Label1.Caption = “握手信号是:”+Hex$(Asc(Readbuff$))<br>
          Msgbox “握手信号正确,已正确联机”<br>
          GoTo CloseP<br>
          End If<br>
          Loop<br>
          CloseP: lRet = CloseHandle( lHandle )<br>
          If lRet = 0 Then<br>
          MsgBox “串行通讯口关闭成功”,48,“提示窗口”<br>
          End If<br>
          End Sub<br>
          <br>
            这里,要注意的是:当PC机与单片机系统通信时,单片机数据存储区( RAM )内的数据是十六进制,在信号线上传输的是十六进制数的ASCII码的二进制形式;而Windows系统下使用的是ANSI码,ANSI码仅在前126个与ASCII码相同。即在Win95下接收到的是十六进制数的ASCII码的字符串,可先转换为ANSI码后再在Win95下还原为十六进制数。<br>
          <br>
          具体如下:Code$ = Hex$( Asc ( Readbuff$ ) )<br>
          <br>
          另外,由于32位API函数参数的数据类型的变化,所有整形参数都被换为长整型(Long)以支持32位的处理,这一点在设置返回值尤其如此。<br>
          <br>
          同时,这些API函数、类型及常量在调用之前,必须先声明再使用。<br>
          <br>
          五、结束语<br>
          <br>
            由上可见,调用API接口的VB串口查询法具有实现简便、难度低、代码精简的突出优点。很适合一般VB程序员在编写通信程序时使用。 </font></span>                                           
          <br>
           
  </table>
</div>
<p align="center"><a href="../../pian/vb.htm">回首页</a>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -