原创 在VB下PC机与MCS-51单片机的串行通信

2009-8-13 19:26 2500 3 3 分类: MCU/ 嵌入式

简介 探讨了在PC机中用Visual Basic下的Microsoft Comm control控件与使用C51编程的MCS\|51单片机之间的串行通信的方法,以及在VB中怎样处理二进制码,并给出了演示程序和通信协议。

%Jx1aSE ^aE44606

4EQ9v5] Ua44606关键词  Visual Basic  单片机  串行通信

tFj$u$?6kl+z44606 电子园51单片机学习网dxw6],d7p?'V$t `8[

  在开发微机控制及数据采集的系统中,经常需要通过RS232接口实现PC机与单片机之间的串行通信。在DOS时代,程序员须要具备相当的硬件知识,才有可能着手编写PC下的串行通信程序。而当今在VB下,利用现有的Microsoft Comm control控件,只需要编写少量的程序代码,就可以轻松、高效地完成任务。更何况Visual Basic是目前广受程序员喜爱的可视化编程语言,利用它还能够编写出Windows下漂亮的应用程序。电子园51单片机学习网RkIUq#d2g

电子园51单片机学习网!d5{+_%TGd&Lc,o0E0r!SP

一、 Microsoft Comm control控件简介电子园51单片机学习网 ]m9^rD\\8X

电子园51单片机学习网-M(x#u^j

  微软公司提供的Microsoft Comm control控件(简称MSComm)为编程者提供了简化的Windows下的串行通信编程,使编程者不必掌握诸多关于硬件方面的知识。它提供了两种处理串行通信的方法:一是事件驱动方法;二是查询法。 电子园51单片机学习网` } F$E$F'apV.t&Z ~t


%kQ&GEVK5P E446061. 事件驱动法电子园51单片机学习网9h2a7D2XS l H"b?


1Y!E*b"?*[)p~1G44606  这是一种很强的处理串口活动的方法。当串口接收到或发送完指定数量的数据时,或当状态发生改变时,MSComm控件都将触发OnComm事件,该事件也可以捕获通信中的错误。当应用程序捕获到这些事件后,可通过检查MSComm控件的CommEvent属性的值来获知所发生的事件或错误,从而执行相应的处理。这种方法具有程序响应及时,可靠性高等优点。

-o/I Q]Ax44606 电子园51单片机学习网/_'[r0^` v

2. 查询法

d#[B e,OH*N:}44606

"Y{5TO'WA44606  可以在每个重要的程序之后查询MSComm控件某些属性(如CommEvent属性和InBufferCount属性)的值来检测事件和通信错误。这对小的自含程序可能比较常用。 电子园51单片机学习网'|X.B ?5KG$}'T


$M'X'M.n$w!m)ZgoX44606  MSComm控件有许多重要的属性,其中几个重要的属性如下: 电子园51单片机学习网z*k-c3V`O(FX

电子园51单片机学习网5Q{I8kb)MG

  · CommPort: 设置或返回通信端口。为1时对应COM1;为2时对应COM2。
}c,_6^*}c,O w44606  · Settings: 设置或返回波特率、奇偶校验、数据位和停止位参数。 电子园51单片机学习网#Si+G6M6P6w }H&Hg0n
  · PortOpen: 打开或关闭通信口。
4@2xV~"YB!P44606  · Input: 读取或删除缓冲区中的数据流。 电子园51单片机学习网 w)oR1xN z s0~
  · Output: 将数据写入发送缓冲区。
0P5KE f(qP(e5uQ*E2i:f44606  · InputLen: 设置和返回Input属性从接收缓冲区中读取的字节数。
J}1J:[2M7Q _%v+W44606  · InputMode: 设置和返回的类型。该属性为0时,Input属性所检取的数据是文本;为1时,Input属性所检取的数据是二进制数据。这个属性对与单片机的通信尤为重要。
电子园51单片机学习网 w SEF4OO LyU

电子园51单片机学习网*Y4S6P\(a'E#f&K

二、 通信线路连接 电子园51单片机学习网fspc3K8\!? K


`)V0R}6A k44606  PC机的某个串行口通过电缆线与RS232收发器MAX232的232电平端口三线交叉连接,如图1所示。MAX232的逻辑电平端口与单片机的串行口相连。PC机RS232的9针连接器的4脚和6脚、7脚和8脚不用连接。

X@?s&Z+M44606


+Yf/{&|)z44606按此在新窗口浏览图片
/[ u]9P$}wp.s44606图1  PC机与单片机的通信接口电路框图
电子园51单片机学习网5z tY.Xj{k

电子园51单片机学习网*T/fur,WX

三、 编程实现

R3M'nv4IKA `u]^j44606 电子园51单片机学习网 hS$g;p9|n,nV(O

1. 实现功能电子园51单片机学习网2l)H_6x4O Y)Pkm)q

电子园51单片机学习网n%Y}8[~ Yy@e5x

  因本程序为通信演示程序,所以功能较为简单。具体功能为利用键盘在PC机中输入一个6字节(12位的0~9,A~F)的二进制数,然后用鼠标点击通信命令按钮,PC机就将此二进制数发给单片机,单片机收到此数后再原样发回,PC机收到后显示在窗体上。试验者可通过肉眼比较发送和接收的两个数据,检验通信是否成功。电子园51单片机学习网~-R w"x8r`*A

电子园51单片机学习网"? VbDmc3W

2. 通信协议电子园51单片机学习网ma2nGG

电子园51单片机学习网(l]lluG/Iu

  波特率:19.2kb/s;无奇偶校验;8位数据位;1位停止位。

;_ cU*g5h"f44606

kgv,FWo8|@Y446063. PC机VB程序电子园51单片机学习网;k;B QZ"_+d^P


MX"^ SX44606  (1)  在工程项目中添加一个窗体,取名为frmcomm,设置其Caption属性为通信。
3fJ&@%j+Fz44606  (2)  在窗体中添加两个大小一样的文本框,分别取名为txtSend和txtRcv。 电子园51单片机学习网yzh%ctW k#E
  (3)  在窗体中添加一个命令按钮,取名为cmdcomm,设置其Caption属性为通信。
H!t/O8l zV/g44606  (4)  在窗体中添加MSComm控件,取名为MSComm1。
#c f5I!~1]Gy.b-E C44606  (5)  打开代码窗口,在cmdcomm控件的Click事件中加入以下程序代码:
电子园51单片机学习网8U2\Qs dG r7l-U

电子园51单片机学习网9Qi@D V

Private Sub cmdcommClick() 电子园51单片机学习网OaRLF~[%t!v'~
  Dim Senddat(5) As Byte,Rcvdat() As Byte, 电子园51单片机学习网5FPM)Nw*Z5N
    dattemp As Variant,i As Integer
.XY7xCo/Tc44606  cmdcomm.Enabled=False′使cmdcomm按钮失效
Srp w!F2^W44606  For i="0" To 5′从发送文本框txtSend获取发送数据
w8L$Q6` w44606    Senddat(i)="&H" & Mid(txtSend.Text,i * 2+1,2) 电子园51单片机学习网rK;L9q"D'R
  Next i
bE#p B8r~Up9R\44606  MSComm1.CommPort=1′设置端口号为1 电子园51单片机学习网^#z)a-nRu
  MSComm1.Settings="19200,N,8,1"′设置波特率等通 ′信协议 电子园51单片机学习网9DU/y]4B
  MSComm1.InputLen=6′设置一次从串口读取6个字节 电子园51单片机学习网(DX.FVt H\
  MSComm1.PortOpen=True′打开串行口 电子园51单片机学习网;qh,oN(TS
  MSComm1.InputMode=comInputModeBinary′从串口 ′读取二进制数据 电子园51单片机学习网(U$eJ5_(Qs#{
  MSComm1.Output=Senddat′发送数据
u UH&G`"G5G44606  Do Until MSComm1.InBufferCount >= 6′查询方式,等 ′待接收到6个字节
+GJC?3U!H rv44606    DoEvents
}Ge;n B!gS/?9N6k44606  Loop
gv&U eR&V&r4MW44606  dattemp=MSComm1.Input′从串口读取数据至变体变量 电子园51单片机学习网DO`bO3@&\ ?
  Rcvdat=dattemp′数据送至接收二进制数组 电子园51单片机学习网"J3kq}Dkt
    txtRcv.Text=""
1x];Y}%Zn/@#F44606  For i="0" To 5′接收数据送至接收文本框txtRcv显示 电子园51单片机学习网 ] T lde2E0L_"}
    txtRcv.Text=txtRcv.Text & Right("0" & Hex(Rcvdat(i)),2) 电子园51单片机学习网H1~B8nq6s?Y-mQ
  Next i
K!N l9Rm*Y P44606  MSComm1.PortOpen=False′关闭串行口
)L ?;r H pC44606  cmdcomm.Enabled=True′使能cmdcomm接钮
&T(u8n'U2se44606End Sub

5g7v+evrPGXL(~*P44606 电子园51单片机学习网Bs&j2ll

  (6)  选择开始-运行。用PC机键盘在输入文本框中输入要发送的6字节二进制数据,然后用鼠标点击通信按钮即可。 电子园51单片机学习网*`K'}WRM

电子园51单片机学习网#B gWy*{

4. 单片机C51程序 电子园51单片机学习网zG-f$]wNH}


\-p(Kg2u$rwW44606  MCS-51单片机晶振为11.0592MHz,串行口的工作方式设置为方式1,10位异步收发。采用查询方式接收和发送,程序清单如下: 电子园51单片机学习网[&}IX7p!jL~


6k @,xy,~'{44606#include
]H9^8Y(Ez'M44606#include uchar unsigned char 电子园51单片机学习网D*y?:`:_&H#~4c1kr*J
main() { 电子园51单片机学习网8{8DY"D(i&]
  uchar temp,datmsg[6]; 电子园51单片机学习网#D!z$p:V)U
  TMOD=0x20; //设置波特率为19.2kb/s
$r.K.?*j}Y44606  PCON=0x80;
)C(E2m3? y B)e&u:q44606  TH1=0xfd; TL1=0xfd;
2srF.w)Lz6V0Qu44606  TR1=1; //启动定时器1 电子园51单片机学习网t H4x*zUp%kQUwr
  SCON=0x50; //设置串行口为10位异步收发,且允许 //接收 电子园51单片机学习网,vAX#Y.s
  while(1) {for(temp=0;temp<6;temp++) //连续接收6个 //字节
P*Mbs&R ixYi44606    {while(RI==0); RI="0"; 电子园51单片机学习网X6M!fu,U-K.O'IY
    datmsg[temp]=SBUF;
6E!a M C0hR0I*?44606    } 电子园51单片机学习网_6g ?c7w
    for(temp=0;temp<6;temp++)//连续发送6个 //字节 电子园51单片机学习网'V1\Z1Hx
    {SBUF=datmsg[temp]; while(TI==0);TI=0; 电子园51单片机学习网_4]eyt-u| ci
    }
Z;D`{;S Jv44606  }
b(umd S l44606}

0Py*h1A$z44606 电子园51单片机学习网^5D6D ^kZ{'C!`

结束语电子园51单片机学习网,@ I5})g-I


%v dX:T\L44606  由于篇幅所限,本程序仅为演示参考程序,并无实际意义。但它展示了PC机和单片机串行通信的一般方法以及在VB中处理二进制数据的方法,使得单片机和PC机的应用能够更加紧密地结合在一起。读者可在此基础上加入一些握手信号和检错码,如奇偶校验、累加和校验及循环冗余校验(CRC)等等,便可成为自己的应用程序。电子园51单片机学习网8H6\1?9p8|9~.`

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条