新闻中心

EEPW首页>嵌入式系统>设计应用> 用VC++6.0实现PC机与单片机之间的数据交换

用VC++6.0实现PC机与单片机之间的数据交换

作者: 时间:2013-02-20 来源:网络 收藏

  dwBytesWritten++;

  }

  }

  1.2 接收例程

  DCB ComDcb; //设备控制块

  HANDLE hCom; //global handle

  hCom = CreateFile ("COM1",GENERIC_READ| GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

  if (hCom==INVALID_HANDLE_VALUE)

  {

  AfxMessageBox("无法打开串行口");

  }

  else

  {

  COMMTIMEOUTS CommTimeOuts ;

  SetCommMask(hCom, EV_RXCHAR ) ;

  SetupComm(hCom, 4096, 4096 ) ; /*设置收发缓冲区 尺寸为4K */

  PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT | PURGE_TXCLEAR| PURGE_RXCLEAR ) ; //清收发缓冲区

  //以下初始化结构变量CommTimeOuts, 设置超时参数 CommTimeOuts.ReadIntervalTimeout = 0×FFFFFFFF ;

  CommTimeOuts.ReadTotalTimeoutMultiplier = 0;

  CommTimeOuts.ReadTotalTimeoutConstant = 4000;

  CommTimeOuts.WriteTotalTimeoutMultiplier = 0;

  CommTimeOuts.WriteTotalTimeoutConstant = 4000;

  SetCommTimeouts(hCom, CommTimeOuts ); //设置超时参数

  ComDcb.DCBlength = sizeof( DCB );

  GetCommState( hCom, ComDcb ); //获取当前参数

  ComDcb.BaudRate =9600; //波特率

  ComDcb.ByteSize = 8; //数据位

  ComDcb.Parity = 0; /*校验 0~4=no, odd, even, mark, space */

  SetCommState(hCom, ComDcb ) ;

  } //设置新的通信参数

  接收可用定时器或线程等

  DWORD dRead,dReadNum;

  unsigned char buff [200];

  dRead=ReadFile(hCom, buff, 100, dReadNum, NULL); //接收100个字符,

  //dReadNum为实际接收字节数

  2 利用端口函数直接操作

  这种方式主要是采用两个端口函数_inp(), _outp()实现对串口的读写,其中读端口函数的原型为:

  int _inp(unsigned shot port)

  该函数从端口读取一个字节,端口号为0~65535。

  写端口的函数原型为:

  int _outp(unsigned shot port, int databyte)

  该函数向指定端口写入一个字节。

  不同的计算机串口地址可能不一样,通过向串口的控制及收发寄存器进行读写,可以实现灵活的串口通信功能,由于涉及具体的硬件电路讨论比较复杂,在此不加赘述。

  3 MSComm控件

  MSComm控件是微软开发的专用通信控件,封装了串口的所有功能,使用很方便,但在实际应用中要小心对其属性进行配置。下面详细说明该类应用方法。

  3.1 MSComm控件的属性

  CommPort:设置串口号,类型 short :1-comm1 2-comm2.

  Settings:设置串口通信参数,类型 CString :B波特率,P奇偶性(N无校验,E偶校验,O奇校验),D字节有效位数,S停止位。

  PortOpen:设置或返回串口状态,类型 BOOL:TURE打开,FALSE关闭。

  InputMode:设置从接收缓冲区读取数据的格式,类型 long: 0-Text 1-Bin。

  Input:从接收缓冲区读取数据,类型 VARIANT。

  InBufferCount:接收缓冲区中的字节数,类型:short。

  InBufferSize:接收缓冲区的大小,类型:short。

  Output:向发送缓冲区写入数据,类型:VARIANT。

  OutBufferCount:发送缓冲区中的字节数,类型:short。

  OutBufferSize:发送缓冲区的大小,类型:short。

  InputLen:设置或返回Input读出的字节数,类型:short。

  CommEvent:串口事件,类型:short。

  3.2 程序示例

  串口初始化

  if (!m_comm.GetPortOpen())m_comm.SetPortOpen(TURE); /*打开串口*/

  m_comm.SetSettings("4800,n,8,1"); /*串口参数设置*/

  m_comm.SetInputMode(0); /*设置TEXT缓冲区输入方式*/

  m_comm.SetRthresHold(1); /*每接收一个字符则激发OnComm()事件*/

  接收数据

  m_comm.SetInputLen(1); /*每次读取一个字符

  VARINAT V1=m_comm.GetInput();

  /*读入字符*/

  m_V1=V1.bstrval;

  发送字符

  m_comm.SetOutput(Colevariant ("Hello"); /*发送 “Hello” */

  3.3 注意

  SetOutput方法可以传输文本数据或二进制数据。用SetOutput方法传输文本数据,必须定义一个包含一个字符串的Variant。发送二进制数据,必须传递一个包含字节数组的Variant 到 Output 属性。正常情况下,如果发送一个 ANSI 字符串到应用程序,可以以文本数据的形式发送。如果发送包含嵌入控制字符、Null 字符等的数据,要以二进制形式发送。此处望引起读者注意,笔者曾经在此犯错。

  4 VC++类CSerial

  4.1 串行通信类CSerial简介

  Cserial 是由MuMega Technologies公司提供的一个免费的VC++类,可方便地实现串行通信。以下为该类定义的说明部分。

  class CSerial

  {

  public:

  CSerial();

  ~CSerial();

  BOOL Open( int nPort = 2, int nBaud = 9600 );

  BOOL Close( void );

  int ReadData( void *, int );

  int SendData( const char *, int );

  int ReadDataWaiting( void );

  BOOL IsOpened( void ){ return( m_bOpened ); }

  protected:

  BOOL WriteCommByte( unsigned char );

  HANDLE m_hIDComDev;

  OVERLAPPED m_OverlappedRead, m_OverlappedWrite;

  BOOL m_bOpened;

  }

  4.2 串行通信类Cserial 成员函数简介

  1. CSerial::Cserial是类构造函数,不带参数,负责初始化所有类成员变量。

  2. CSerial:: Open这个成员函数打开通信端口。带两个参数,第一个是埠号,有效值是1到4,第二个参数是波特率,返回一个布尔量。

  3. CSerial:: Close函数关闭通信端口。类析构函数调用这个函数,所以可不用显式调用这个函数。

  4. CSerial:: SendData函数把数据从一个缓冲区写到串行端口。它所带的第一个参数是缓冲区指针,其中包含要被发送的资料;这个函数返回已写到端口的实际字节数。

  5. CSerial:: ReadDataWaiting函数返回等待在通信端口缓冲区中的数据,不带参数。

  6. CSerial:: ReadData函数从端口接收缓冲区读入数据。第一个参数是void*缓冲区指针,资料将被放入该缓冲区;第二个参数是个整数值,给出缓冲区的大小。

  4.3 应用VC类的一个实例

  1. 固定式EBM气溶胶灭火系统简介

  固定式EBM气溶胶灭火装置分区启动器是专为EBM灭火装置设计的自动控制设备。可与两线制感温、感烟探测器配套使用,当监测部位发生火情时,探测器发出电信号给分区启动器,经逻辑判断后发出声、光报警,延时后自动启动EBM灭火装置。为了便于火灾事故的事后分析,需对重要的火警事件和关键性操作进行记录,记录应能从读出来;能控制、协调整个系统的工作,这些都涉及通信。本例中启动器采用RS-485通信接口,系统为主从式网络,为上位机。具体的通信协议为:

  (1)下位机定时向上传送记录的事件;

  (2)应答发送,即PC机要得到最新事件记录,而传送时间未到时,PC机发送命令,下位机接收命令后,把最新记录传给上位机;

  (3)上位机发送其它命令如校时、启动、停止、手/自动等。

c语言相关文章:c语言教程


单片机相关文章:单片机教程


c++相关文章:c++教程


单片机相关文章:单片机视频教程


单片机相关文章:单片机工作原理




评论


相关推荐

技术专区

关闭