新闻中心

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

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

作者:时间:2013-02-20来源:网络收藏
工业控制领域(如DCS系统),经常涉及到串行通信问题。为了实现微机和之间的,人们用各种不同方法实现串行通信,如DOS下采用汇编语言或C语言,但在Windows 环境下却存在一些困难和不足。在Windows操作系统已经占据统治地位的情况下(何况有些系统根本不支持DOS如Windows2000)开发Windows 环境下串行通信技术就显得日益重要。是微软公司于1998年推出的一种开发环境,以其强大的功能,友好的界面,32位面向对象的程序设计及Active X的灵活性而受广大软件开发者的青睐,被广泛应用于各个领域。应用VC++开发串行通信目前通常有如下几种方法:一是利用Windows API通信函数;二是利用VC的标准通信函数inp、inpw、inpd、outp、outpw、outpd等直接对串口进行操作;三是使用Microsoft Visual C++的通信控件(MSComm);四是利用第三方编写的通信类。以上几种方法中第一种使用面较广,但由于比较复杂,专业化程度较高,使用较困难;第二种需要了解硬件电路结构原理;第三种方法看来较简单,只需要对串口进行简单配置,但是由于使用令人费解的VARIANT 类,使用也不是很容易;第四种方法是利用一种用于串行通信的CSerial类(这种类是由第三方提供),只要理解这种类的几个成员函数,就能方便的使用。笔者利用CSerial类很方便地实现了在固定式EBM气溶胶灭火系统分区启动器(系统)与上位机的通信。以下将结合实例,给出实现串行通信的几种方法。

  1 Windows API通信函数方法

  与通信有关的Windows API函数共有26个,但主要有关的有:

  CreateFile() 用 “comn”(n为串口号)作为文件名就可以打开串口。

  ReadFile() 读串口。

  WriteFile() 写串口。

  CloseHandle() 关闭串口句柄。

  初始化时应注意CreateFile()函数中串口共享方式应设为0,串口为不可共享设备,其它与一般文件读写类似。以下给出API实现的源代码。

  1.1 发送的例程

  //声明全局变量

  HANDLE m_hIDComDev;

  OVERLAPPED m_OverlappedRead, m_Over lappedWrite;

  //初始化串口

  void CSerialAPIView::OnInitialUpdate()

  {

  CView::OnInitialUpdate();

  Char szComParams[50];

  DCB dcb;

  Memset(m_OverlappedRead, 0, sizeof (OVERLAPPED));

  Memset(m_OverlappedWrite, 0, sizeof (OVERLAPPED));

  m_hIDComDev = NULL;

  m_hIDComDev = CreateFile(“COM2”, GENERIC_READ│GENERIC_WRITE, 0, NULL,

  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL│FILE_FLAG_OVERLAPPED, NULL);

  if (m_hIDComDev == NULL)

  {

  AfxMessageBox(“Can not open serial port!”);

  goto endd;

  }

  memset(m_OverlappedRead, 0, sizeof (OVERLAPPED));

  memset(m_OverlappedWrite, 0, sizeof (OVERLAPPED));

  COMMTIMEOUTS CommTimeOuts;

  CommTimeOuts.ReadIntervalTimeout=0×FFFFFFFF;

  CommTimeOuts.ReadTotalTimeoutMultiplier = 0;

  CommTimeOuts.ReadTotalTimeoutConstant = 0;

  CommTimeOuts.WriteTotalTimeoutMultiplier = 0;

  CommTimeOuts.WriteTotalTimeoutConstant = 5000;

  SetCommTimeouts(m_hIDComDev, CommTimeOuts);

  Wsprintf(szComparams, “COM2:9600, n, 8, 1”);

  m_OverlappedRead. hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

  m_OverlappedWrite. hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

  dcb. DCBlength = sizeof(DCB);

  GetCommState(m_hIDComDev, dcb);

  dcb. BaudRate = 9600;

  dcb. ByteSize= 8;

  unsigned char ucSet;

  ucSet = (unsigned char) ((FC_RTSCTSFC_DTRDSR) != 0);

  ucSet = (unsigned char) ((FC_RTSCTSFC_RTSCTS) ! = 0);

  ucSet = (unsigned char) ((FC_RTSCTSFC_XONXOFF) ! = 0);

  if (!SetCommState(m_hIDComDev, dcb)‖

  !SetupComm(m_hIDComDev,10000,10000)‖

  m_OverlappedRead. hEvent ==NULL‖

  m_OverlappedWrite. hEvent ==NULL)

  {

  DWORD dwError = GetLastError();

  if (m_OverlappedRead. hEvent != NULL)

  CloseHandle(m_OverlappedRead. hEvent);

  if (m_OverlappedWrite. hEvent != NULL)

  CloseHandle(m_OverlappedWrite. hEvent);

  CloseHandle(m_hIDComDev);

  }

  endd:

  ;

  }

  //发送数据

  void CSerialAPIView::OnSend()

  {

  char szMessage[20] = “thank you very much”;

  DWORD dwBytesWritten;

  for (int i=0; isizeof(szMessage); i++)

  {

  WriteFile(m_hIDComDev, (LPSTR)szMessage[i], 1, dwBytesWritten, m_OverlappedWrite);

  if (WaitForSingleObject(m_OverlapperWrite, hEvent, 1000))dwBytesWritten = 0;

  else

  {

  GentOverlappedResult(m_hIDComDev, m_OverlappedWrite, dwBytesWritten, FALSE);

  m_OverlappedWrite. Offset += dwBytesWritten;

  }

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


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


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


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


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



上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭