用VC实现PC机与单片机的通信

发布者:骄阳少年最新更新时间:2012-03-08 来源: 微计算机信息 关键字:串行通信  Visual  C++  单片机 手机看文章 扫描二维码
随时随地手机看文章

  在工业检测及自动控制系统中,微机与微机、微机与单片机之间经常需要进行数据交换,串行通信是主要的通信手段,它高效、方便,并遵循统一的国家标准。 Visual C++ 6.0作为一种强大的开发工具几乎在Windows软件开发的任何领域都得到广泛的应用。一般用Visual C++ 6.0开发串行通信程序有二种方法:一是利用Windows的通信 API函数;另一种是采用Visual C++  6.0标准控件MSComm来实现。第一种方法需要声明及调用许多API函数,十分烦琐。第二种方法实现简便,且可满足一般情况下通信要求。本文利用Visual C++ 6.0提供的MSComm通信控件编写较简单的VC程序, 完成了微机与单片机之间的 RS-232串行口通信。

1、硬件结构
PC微机的COM口接口电平为RS-232标准,若两台微机间通信,只需简单地直接连接(TXD RXD)及地(GND)三根线。若微机与单片机通信,由于单片机UART为TTL电平,故需将RS-232电平与TTL电平转换,可直接使用 MAX232,MC1489等实现电平转换功能。

2、串行通信控件MSComm
    在VC环境下单击Project菜单,从中选择Add to Project,在弹出的对话框中单击Components and Controls选项,然后在弹出的对话框中再单击Registered ActiveX Controls选项。在列表中选择Microsoft Communications Control (version6.0),形状为带有红色底座的黄色电话机。单击Insert按钮,确认后,会出现一个Confirm Classes对话框,其中列出了该控件的类名(CMSComm)、头文件名(MSComm.h)、执行文件名(MSComm.cpp)。关闭此对话框,在程序主界面的控件列表中,可以看到该通信控件已被加入,拖动该控件就可以将其放入程序中。
   MSComm控件提供了功能完善的串口数据的发送和接收功能, MSComm控件具有两种处理方式: 1、事件驱动方式:由MSComm控件的OnComm事件捕获并处理通信错误及事件;2、查询方式:通过检查CommEvent属性的值来判断事件和错误。
   MSComm控件的通信功能实现,实际上是调用了API函数,而API函数是由Comm.drv解释并传给设备驱动程序执行的,对于VC程序开发者只需知道MSComm控件的属性和事件的用法即可以实现串口的操作。
  以下是MSComm控件的主要属性和方法:
  1) CommPort:设置或返回串行端口号,其取值范围为1~99,缺省为1。
  2) Setting:设置或返回串行端口的波特率、奇偶校验位、数据位数、停止位。如:M scomm.Setting="9600,N,8,1"。
  3) PortOpen:打开或关闭串行端口,格式为:MSComm.PortOpen={T RUE|FALSE}。
  4) InBufferSize:设置或返回接收缓冲区的大小,缺省为1024字节。
  5) InBufferCount:返回接收缓冲区内的等待读取的字节个数,可通过设置该属性为0来清除接收缓冲区。
  6) Rthreshold:该属性为一阀值,它确定当接收缓冲区内字节个数达到或超过该值后就产生代码为MSCOMM_EV_RECEIVE的OnComm事件 。
  7) InputLen::设置或返回接收缓冲区内用Input读入的个数。若取0,则INPUT读取整个缓冲区的内容。
  8) Input: 该属性表示从接收缓冲区移走一串字符。 类型:VARIANT。
  9) OutBufferSize:设置或返回发送缓冲区,缺省为512字节。
  10) OutBufferCount:返回发送缓冲区内等待发送的字符数,可用来清空缓冲区。
  11) Output:向发送缓冲区传送一字符串。类型:VARIANT。
  如果在通信过程中发生错误或事件,就会引发OnComm事件并且改 变属性值,由CommEvent属性代码反映错误类型,在通信程序的设计中 可根据该属性值来执行不同的操作,以下是部分属性常数值及其含义:
  1) ComEvSend: 其值为1,发送缓冲区的内容少于SThreshold指定 的值。
  2) ComEvReceive: 其值为2,接收缓冲区内字符数达到 RThreshold 值,该事件在缓冲区中数据被移走前将持续产生。
  3) ComEventFrame: 其值为1004,硬件检测到帧错误。
  4) ComEventRxOver:其值为1008,接收缓冲区溢出。
  5) ComEventTxFull: 其值为1010,发送缓冲区溢出。
  6) ComEventRxParity:其值为1009,奇偶校验。
  7) ComEvEOF: 其值为7,接收数据中出现文件结束(ASCII 码为 2 6)字符。

3、串口通信微机程序设计
    下面程序可实现简单通信,程序主要有两个编辑框,一为发送,用户在此编辑框内键入字符将通过串口发送出去;另一为接收,显示串口接收到字符。如在两台微机相连,分别运行此程序,即可实现两机之间通信。具体实现步骤如下:
    1)启动Visual C++ 6.0,创建一名为Chat应用程序项目,程序类型为Dialog based。
    2)如2所述在应用程序中插入通信控件。
    3)MFC的ClassWizard 对话框的Member Variables选项卡如下所示


控件ID 类型 数据成员
IDC_EDIT1_SEND Cstring m_send
IDC_EDIT2_RECV Cstring m_recv
IDC_MSCOMM1 CMSComm m_comm
IDCANCEL  
    4)部分源程序代码如下:
BOOL CChatDlg::OnInitDialog(  )
{
 CDialog::OnInitDialog( );
// TODO: Add extra initialization here
   m_comm.SetCommPort(1);        //选择串口1
   if(!m_comm.GetPortOpen( ))
   m_comm.SetPortOpen(TRUE);     //打开串口1
   m_comm.SetSettings("9600,n,8,1");  //串口参数设置
   m_comm.SetRThreshold(1);      //当串口接收缓冲区内接收字符多于或等于
1将触发一关于comEvReceive的OnComm事件。
 return TRUE;  // return TRUE unless you set the focus to a control
               // EXCEPTION: OCX Property Pages should return FALSE
}
void CChatDlg::OnChangeEdit1Send(  )
{  // TODO: Add your control notification handler code here
 int count;
 CString temp;
 UpdateData(TRUE);           //获取用户输入数据
 count=m_send.GetLength( );    //获取编辑框内字符数
 temp=m_send.GetAt(count-1);   //取最新输入字符
 if(!m_comm.GetPortOpen( ))
    m_comm.SetPortOpen(TRUE);
 m_comm.SetOutput(COleVariant(temp));    //发送数据
 if(count= =40)                  //如输入字符超过40,清空发送编辑框
 { m_send.Empty( );
      UpdateData(FALSE);          //更新编辑框
 }
}[page]
void CChatDlg::OnOnCommMscomm 1(  )
{
 // TODO: Add your control notification handler code here
 VARIANT temp;
 int count;
     if(m_comm.GetCommEvent( )= =2)       //串行口数据接收处理;
 { count=m_comm.GetInBufferCount( );
  m_comm.SetInputLen(count);      //利用Input接收字符数为count
  temp=m_comm.GetInput( );       //接收字符
  m_recv+=temp.bstrVal;           //将接收字符添加到接收框变量中
  if(m_recv.GetLength( )= =40)      //如输入字符超过40,清空发送编辑框
  m_recv.Empty( );
       UpdateData(FALSE);           //更新编辑框
 }
}

4、串行通信单片机程序设计
    在此作为演示,此单片机程序功能只是简单将所收字符再发送出去,类似可实现各种复杂通信协议。将微机与单片机相连后,微机运行chat.exe,单片机运行此程序即可实现两机通信。
下面是MC68HC908GP32为例的程序清单。
 *==========Registers===========
SCCR1  equ $0013
b_ENSCI  equ 6
SCCR2  equ $0014
b_TE  equ 3
b_RE  equ 2
BAUD  equ $0019
SCS1 equ $0016
SCS2 equ $0017
SCDR equ $0018
CONFIG2  equ $001e
CONFIG1  equ $001f
PCTL  equ $0036
b_PLLON  equ 5
b_BCS  equ 4
PBWC  equ $0037
b_AUTO  equ 7
PMSH  equ $0038
PMSL  equ $0039
PMRS  equ $003a
*==========Initial Codes========
           ORG $8000
RESET_INIT:
   SEI
   LDHX #$023F
   TXS
        LDA   #$01
        STA   CONFIG2
        LDA   #$3D
        STA   CONFIG1
*========== Initial CGMC=========
       CLR     PCTL
       MOV     #$01,PCTL
       MOV #$01,PMSH
       MOV #$2C,PMSL
       MOV #$80,PMRS
       BSET    b_PLLON,PCTL    ;32.768khz --2.4576Mhz
       BSET    b_AUTO,PBWC
       BSET    b_BCS,PCTL
*========= Initial SCI==========*
       LDA #$02
       STA    BAUD            ;9600baud
       BSET   b_ENSCI,SCCR1   ;ENABLE SCI
       MOV #$0C,SCCR2         ;ENABLE TRANSMITTER AND RECEIVER
*==========Main program========*
START:CLI
      JSR GETDATA
      JSR SENDATA
      JMP START
GETDATA:BRCLR 5,SCS1,GETDATA
        LDA SCDR
        RTS
SENDATA:BRCLR 7,SCS1,SENDATA
        STA SCDR
        RTS
*===========Vector=============*
         ORG  $FFFE
         DW  RESET_INIT
    若要实现一台微机(主机)与多台GP32通信,可用SCI接收器唤醒功能(空闲线或地址位)。主机与从机通信时,发送信息的开头一般为从机地址,各从机接收信息开头的地址,如发现地址与自己的地址相同,则准备接收后面的数据,负责不予理睬。至此我们用Visual C++ 6.0实现了微机与微机以及微机与单片机之间的串行通信,通过更复杂的通信协议,完全可满足工业测控系统中的一般数据通信要求。

参考文献:
[1]刘慧根等. MC68HC08原理及其嵌入是应用. 清华大学出版社,2001.
[2]刘瑜. Windows环境下串行通信程序设计. 计算机应用与研究,1999.

关键字:串行通信  Visual  C++  单片机 引用地址:用VC实现PC机与单片机的通信

上一篇:MSP430 单片机C语言和汇编语言混合编程
下一篇:单片机在温度控制中的应用

推荐阅读最新更新时间:2024-03-16 12:55

AVR单片机的相关总结
1、AVR文档里要求最好不要中断嵌套,只能执行完这个中断再执行下一个中断; 2、ADC采样的时候,外部存在上拉51K的情况下,断路,测量的电压值是5V(工作电压是5V),说明mega88的输入阻抗是相当大的 哈哈; 3、SREG状态寄存器中, SEI、CLI就是开全局中断、关全局中断 (还以为没有来着),_NOP 、 _WDR; 4、Volatile (不稳定的) AVR全局变量的时候用 (可以避免编辑器对其的优化); 5、不用的IO口如果悬空的话,1是耗电量大处于判断状态;2是 受外界一点点干扰就可能成为反复振荡的输入信号(干扰问题); 6、推挽结构,输出不能直接接地 (大电流烧掉管子); 7、明确 PC (Program
[单片机]
AVR<font color='red'>单片机</font>的相关总结
基于PIC16F877A单片机的LED点阵手写屏设计
  本文采用PIC16F877A单片机为主要核心控制元件,设计了一个32×32 LED点阵模块的书写显示屏。它主要由光笔模块和点阵显示模块组成,光笔模块利用光敏电阻的光电特性,实现微亮检测功能。光笔反馈信号经放大器LM324 比较后,送给单片机处理。32×32点阵显示模块、驱动模块由74HC595外设驱动阵列和8位串行输入/输出移位寄存器ULN2803A组成。光笔通过显示屏微亮扫描寻找坐标值,按键和LED指示灯可实现“点亮、划亮、反显、整屏擦除、笔画擦除、连写多字、对象拖移”等书写显示功能。   系统系统总体构成   本系统设计包括三大部分:PIC16F877A单片机主控器、光笔控制器、点阵显示屏。系统的结构如图1所示。
[单片机]
基于PIC16F877A<font color='red'>单片机</font>的LED点阵手写屏设计
单片机电机测速程序
这个51单片机+电机霍尔测速程序是从一个制作成功的智能小车里面提取出来的 原理图及其源代码压缩包的下载地址:http://www.51hei.com/bbs/dpj-19526-1.html 下面是主要的程序文件预览: #include reg52.h unsigned int i=0; sbit P36=P3^6; unsigned char j; unsigned int kop; unsigned char a ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char b ={0xff,0xff,0xff,0xff,0xff,0xff,0xf
[单片机]
<font color='red'>单片机</font>电机测速程序
8051单片机(STC89C52)倒计时器
#include STC89C5xRC.H void delay()//用定时器0实现10ms精准定时 { TMOD = 0x01; TH0 = 0xd8; TL0 = 0xf0;//65536 - 10000 = 55536 TF0 = 0;//置溢出标志位为0 TR0 = 1;//开启定时器0 while(TF0 == 0); TR0 = 0;//暂停定时器0 } void disp_digit(int d) { unsigned char code DIG_CODE = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x
[单片机]
8051<font color='red'>单片机</font>(STC89<font color='red'>C</font>52)倒计时器
选择PIC单片机的四大理由
本人从事单片机应用系统的开发已有多年,使用过多种型号的PIC单片机,深感PIC单片机使用起来确实很方便: 1、 PIC单片机采用精简指令集,中档产品仅需35条指令,入门门槛低,而在使用过程中绝不会感到不方便。 2、PIC单片机的数据线和指令线各自独立,代码效率高,是传统51系列单片机的2-3倍,除几个跳转类指令外均为单周期指令,在 计算延时时间时非常方便。 3、PIC单片机外围接口十分丰富,能满足绝大部分应用系统的需求;比如PIC16F877A包含8路ADC,1个CCP、PWM、USART、SSP、 I2C/SPI,3个定时/计数器,1个硬件WDT等接口,8K FLASH程序存储器、256字节EEPROM,能满足较复杂
[单片机]
小米6C曝光:将搭载高通骁龙660八核处理器
    8月8日消息,小米今年每月都有几款新机亮相,已经成为用户购买性价比首选的机型。现在最新消息,来自Geekbench跑分网站出现了疑似小米6c新机型,这是一款主要针对中端机市场的机型。   据消息了解,来自Geekbench网站提供的信息来看,该手机代号小米Jason,采用5.1英寸1080P显示屏,搭载高通骁龙660八核处理器,内置6GB运存+64GB存储组合,配备前置300万像素镜头+1100万像素镜头组合,运行基于Android 7.1.1优化的MIUI系统。   另外,按照惯例小米6C应该会延续上一代彭拜系列处理器,也有消息称搭载最新的彭拜S2处理器,保持自主研发的第一代Soc,采用台积电16nmFFC工艺,
[手机便携]
单片机玩PID控制—从理想PID控制至先进PID控制_4
2.2 基于VB6的通信程序 通信程序分成两部分,一部分是与单片机串口通信,另一部分是与WINCC OPC数据交换。用VB6进行通信编程,需要添加串口通信MSComm控件,如图1所示,为了在VB6中开发OPC应用程序,需要一个OPC包装DLL:OPC Automation2.0,并添加在引用中,如图2所示。在串口通信中,接收数据采用事件驱动的方式,而发送数据采用周期性发送方式,在OPC数据交换中,读写数据均是周期性的,那为了实现周期性数据收发,就需要一个定时器控件Timer,VB6的开发界面图3所示。在串口通信程序调试过程中,发现数据交换量多了,通信容易出错,貌似两侧(单片机和VB端)都有问题,如像前面图中的控制信号突变这种现
[单片机]
用<font color='red'>单片机</font>玩PID控制—从理想PID控制至先进PID控制_4
采用单片机C8051F310实现光伏电池MPPT控制器的设计
1 引 言 能源是人类社会存在和发展的重要物质基础,随着社会的发展,能源日渐减少,并伴随着环境问题日益突出,使得越来越多的国家把目光投向可再生能源。太阳能作为重要能源之一,以其永不枯竭,无污染等优点,正得到迅速的发展。但是太阳能电池在其工作过程中,由于受环境(主要包括日照强度,温度)的影响,其输出具有明显的非线性特性,造成电池与负载之间的不匹配,从而不能使太阳能最大效率地转化为电能输出。为了实现光伏发电系统的功率输出最大化,就需要对光伏电池的最大功率点进行跟踪控制,即MPPT(MaximumPower Point Tracking)控制。 在光伏控制技术上,MPPT控制方法有很多种,目前市场上常用的是使用CVT(恒定电压跟踪)
[单片机]
采用<font color='red'>单片机</font><font color='red'>C</font>8051F310实现光伏电池MPPT控制器的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved