微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 用VC++6.0实现PC机与单片机之间的数据交换

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

时间:02-20 来源:互联网 点击:

appedWrite, dwBytesWritten, FALSE);

  m_OverlappedWrite. Offset += dwBytesWritten;

  }

  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( cons

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top