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

📄 上海齐济电子-应用技巧-pic16系列单片机与pc机串行通信的软硬件实现.htm

📁 一些收集到的PIC文章
💻 HTM
📖 第 1 页 / 共 4 页
字号:
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; 
      cDCBConfig.parity = None</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; cDCBConfig.data 
      = 8</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; cDCBConfig.stop 
      = 1</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; lResult = 
      BuildCommDCB(cDCBConfig,DCB_COMM) &nbsp;&nbsp;&nbsp; 
      ’按用户设定配置一个DCB结构</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; If lResult = 0 
      Then</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      OpenThePort = False</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBox 
      “无法建立DCB设备控制块”</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit 
      Function</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; End 
      If</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; lResult = 
      SetCommState(lHandle,DCB_Comm)&nbsp; 
      ’实际设置一个串口的DCB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; If lResult = 0 
      Then</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      OpenThePort = False</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBox 
      “无法建立DCB设备控制块”</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit 
      Function</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; End 
      If</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; OpenThePort = 
      True</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">End Function</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">Private Sub SendHand ( ) 
      ’发送握手信号的子过程</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; Dim Nchars As 
      Long</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; Static Readbuff 
      As String * 1</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; Static 
      Writebuff As String * 1</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; Dim lpDCB As 
      DCB</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; Dim lRet As 
      Long</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; Dim lHandle As 
      Long</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; Dim 
      lpOverlapped As OVERLAPPED</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; Dim RNum As 
      Integer</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; MsgBox 
      “请把读卡器插在串口2上!”,</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      48,“提示窗口”</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; lHandle = 
      OpenThePort(COMM1,2400,None,8,1)</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; lRet = 
      PurgeComm( lHandle,1 ) ’清输出缓冲区</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; lRet = 
      PurgeComm( lHandle,0 ) ’清输入缓冲区</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; lRet = 
      GetCommState ( lHandle,lpDCB ) ’获得通讯口的状态</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">Shand:</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; Writebuff$= 
      Chr$(&amp;H8F)</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; lRet = 
      WriteFile (lHandle,Writebuff$,1,Nchars,lpOverlapped ) </SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      ’送握手信号入串口缓冲区</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If lRet &lt;= 0 
      Then</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      MsgBox “发送操作出错,卡握手信号未发送成功”, 16</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      GoTo Shand ’不成功则重发</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 
      GoTo Qtest</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; GoTo 
      Shand</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">Qtest:</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; Readbuff$ =“ ” 
      ’清除缓冲区为空</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">Do While lHandle 
      ’循环查询串口</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; RNum = 0 
      ’设置读串口次数的指针为0</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">ReadAgain:</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; lRet = 
      ReadFile( lHandle,&nbsp;&nbsp; Readbuff$,1,Nchars,lpOverlapped 
)</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; If lRet &lt; 0 
      Then</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBox “读取应答信号时出错”, 
      16</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If lRet = 0 
      Then</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If 
      RNum &gt; 1000 Then&nbsp; ’只读1000次串口,以免陷入死循环</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      MsgBox </SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      "卡没有插接好或卡没有接在串口上!"</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      GoTo CloseP</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End 
      If</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RNum = 
      RNum + 1</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GoTo 
      ReadAgain</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; End 
      If</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; If 
      Hex$(Asc(Readbuff)) &lt;&gt; Hex$(&amp;HFF) Then GoTo Shand </SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      ’回送码不正确则返回继续发送握手信号</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; Else</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Label1.Caption = 
      “握手信号是:”</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      +Hex$(Asc(Readbuff$))</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Msgbox 
      “握手信号正确,已正确联机”</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GoTo 
      CloseP</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; End 
      If</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">Loop</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">CloseP:lRet = CloseHandle( 
      lHandle )</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      If lRet = 0 Then</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      &nbsp;&nbsp; MsgBox “串行通讯口关闭成功”,</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      &nbsp;&nbsp; 48,“提示窗口”</SPAN></P>
      <P align=justify><SPAN 
      style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      End If</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">End Sub</SPAN></P>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; 
      这里要注意的是:当PC机与单片机系统通信时,单片机数据存储区( RAM 
      )内的数据是十六进制,在信号线上传输的是十六进制数的ASCII码的二进制形式;而Windows系统下使用的是ANSI码,ANSI码仅在前126个与ASCII码相同。即在Win95下接收到的是十六进制数的ASCII码的字符串,可先转换为ANSI码后再在Win95下还原为十六进制数。<BR>&nbsp;&nbsp; 
      具体为:Code$=Hex$(Asc ( Readbuff$ ) )<BR>&nbsp;&nbsp; 
      另外,由于32位API函数参数的数据类型的变化,所有整形参数都被换为长整型(Long)以支持32位的处理,这一点在设置返回值时尤其如此。</SPAN></P><B>
      <P align=justify><SPAN style="FONT-SIZE: 9pt"><FONT color=#800080>6 
      结束语</FONT></SPAN></P></B>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp; 
      以上的软硬件在我们的实践中达到了较为理想的效果。通过软件节省了硬件的开销,并通过在PIC16F84单片机系统和PC机双方的通信软件内增加握手信号,达到了软件数据校验的目的,获得了较高的通信可靠性。</SPAN></P><B>
      <P align=center><SPAN style="FONT-SIZE: 9pt"><FONT color=#800080>参 考 文 
      献</FONT></SPAN></P></B>
      <P align=justify><SPAN style="FONT-SIZE: 9pt">1 MICROCHIP CO. PIC16/17 
      MICROCO-NTROLLER DATA BOOK. 1995/1996&nbsp;&nbsp; <BR>2 李东星等. 
      PIC16CXX系列单片机应用设计. 高奇电子科技公司,1996.10 <BR>3 美 Darwin Boyle等. Visual Basic 4 
      Developer’s Guide. 北京:机械工<BR>&nbsp; 业出版社,1997. 
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      &nbsp; </SPAN><!-- InstanceEndEditable --></P></TD></TR>
  <TR>
    <TD>&nbsp;</TD></TR>
  <TR align=middle>
    <TD><A href="http://www.chipgem.com.cn/refer/yyjq81.htm#"><IMG border=0 
      src="上海齐济电子-应用技巧-PIC16系列单片机与PC机串行通信的软硬件实现.files/img_top_cn.gif"></A> <A 
      href="javascript:window.print()"><IMG border=0 
      src="上海齐济电子-应用技巧-PIC16系列单片机与PC机串行通信的软硬件实现.files/img_print_cn.gif"></A> <A 
      href="javascript:window.close()"><IMG border=0 
      src="上海齐济电子-应用技巧-PIC16系列单片机与PC机串行通信的软硬件实现.files/img_close_cn.gif"></A></TD></TR></TBODY></TABLE>
<TABLE align=center border=0 borderColor=#0099ff width=768>
  <TBODY>
  <TR>
    <TD>
      <HR align=center class=hr SIZE=1 width="100%">
    </TD></TR>
  <TR align=middle>
    <TD class=footer>上海市大连路1548号莱克大厦26D(200092) 电话:021-65630199 65630173 
      65630142 传真:021-65630332<BR>上海齐济电子有限公司 <A 
      href="http://www.chipgem.com.cn/refer/yyjq81.htm#" 
      onclick="javascript:window.external.addFavorite('http://www.chipgem.com.cn','上海齐济电子有限公司')">http://www.chipgem.com.cn/refer/yyjq81.htm#</A> 
      Copyright&copy;2003-2004</TD></TR></TBODY></TABLE><!-- InstanceEnd --></BODY></HTML>

⌨️ 快捷键说明

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