CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

串口操作!!!

楼主be_better(命犯天煞孤星)2002-04-11 09:43:15 在 VC/MFC / 基础类 提问

谁能告诉我有关串口操作的方法,最好有例子   :)  
  谢谢, 问题点数:20、回复次数:4Top

1 楼redlight(redlight)回复于 2002-04-11 10:57:09 得分 11

在开始进行代码编程前,首先以在工程中插入组件或控件的方式将Active   X控件"Microsoft   Communications   Control,version   6.0"加入到工程中来,此时将会在工程中添加一个关于此控件的新类。使用该控件的一些方法和属性时不能象使用类一样简单的声明一个实例对象,而要通ClassWizard为该控件和一个成员变量建立起绑定关系,在此我们将该控件同变量m_Comm相绑定后就可以通过该控件提供的方法来对串口的各种通讯参数进行设置了。为了编程方便起见,也可以在资源视图中直接对该控件的属性进行设置,如无特别要求,对下表所列属性进行设置就基本可以满足编程要求了。现将常用的属性列表如下:  
   
   
  属性   设定值   属性说明    
  CommPort   1   串口号,一般从1到4    
  InBufferSize   30720   接收缓冲区大小,为保持程序的稳定,建议设得值足够大    
  InputMode   0-Text   接收数据的类型,0表示文本类型,1表示二进制类型    
  InputLen   0   从接收缓冲区读取的字节数,0表示全部读取    
  OutBufferSize   512   发送缓冲区大小    
  Settings   4800,n,8,1   串口的参数设置,依次为波特率、奇偶校验(n-无校验,e-偶校验,o-奇校验)、数据位数、停止位数    
  RThreshold   1   设定当接收几个字符时触发OnComm事件,0表示不产生事件,  
  1表示每接收一个字符就产生一个事件    
  SThreshold   0   设定在触发OnComm事件前,发送缓冲区内所允许的最少的字符数,  
  0表示发送数据时不产生事件,1表示当发送缓冲区空时产生OnComm事件    
   
   
    我们要求能在程序启动的同时就打开串口以便即时对从串口到达的数据进行接收、处理。一般来说可以将下面的打开端口的代码写在OnCreate()、OnInitialUpdate()、InitInstance   ()等程序入口函数中:  
   
  ……  
  if(!m_Comm.GetPortOpen())   //检测是否已经打开过端口  
  m_Comm.SetPortOpen(TRUE);   //如没有打开则将端口打开  
  ……    
  接下来的工作就是对数据的发送与接收了,这也是本文所要介绍的重点所在。发送数据的代码原则上是可以写到一个成员函数中被直接调用的,但这并不是一个良好的编程习惯:我们应当把比较耗时的操作,如文件拷贝、打印、端口传输等工作放到一个单独的线程当中,以避免其在工作时会引起整个进程的阻塞,以提高整个系统对CPU的利用率。例如我们可以在视类中菜单或按钮的响应函数中用AfxBeginThread(WriteProc,this)函数来开启一个名为"WriteProc"的线程,由于在线程中还需要使用视类的函数和变量,为了不产生新的视类的实例对象,我们通过该函数的第二个参数将指向当前的视类的指针this作为参数传递给线程。在线程中可以用如下两种方法之中的一种调用视类的成员函数:  
   
  ((COLECommView*)   pParam)->DoSendProc();    
   
    或是:  
   
  COLECommView*   view=(COLECommView*)   pParam;  
  View->DoSendProc();  
   
   
    其中从pParam传来的变量就是指向视类的指针。在线程中通过调用视类中的DoSendProc函数来完成对数据的发送,正是由于该函数是被全局的线程所调用的,我们就不可以使用取编辑框上的数据时通常所用的UpdateData()函数了,取而带之的是API   函数GetDlgItemText(),取到输入的数据后通过控件的SetOutput()   方法就把数据从串口发出去了,其中发送数据必须经ColeVariant类将其转换为通用的VARIANT型变量。实现  
  主要代码如下:  
   
  ……  
  char   a[255];  
  HWND   hwnd=GetSafeHwnd();  
  ::GetDlgItemText(hwnd,IDC_EDIT1,a,255);  
  int   i=0;  
  CString   str;  
  while(a[i]!='\0')  
  {  
  str.Format("%c",a[i]);  
  m_SendData+=str;  
  i++;  
  }  
  str.Format("%c",10);  
  m_SendData+=str;  
  m_Comm.SetOutput(COleVariant(m_SendData));  
  ……    
   
    至于数据的接收,我们可以通过让MS   Comm控件响应其OnComm事件来完成,通过ClassWizard加入其对事件的响应后,通过下面的事件映射,当有字符到达时便会通知   OnComm()函数去处理,从而实现数据的异步接收:  
   
  ……  
  BEGIN_EVENTSINK_MAP(COLECommView,   CFormView)  
  //{{AFX_EVENTSINK_MAP(COLECommView)  
  ON_EVENT(COLECommView,   IDC_MSCOMM1,   1   /*   OnComm   */,   OnComm,   VTS_NONE)  
  //}}AFX_EVENTSINK_MAP  
  END_EVENTSINK_MAP()  
  ……  
  void   COLECommView::OnComm()  
  {  
  VARIANT   Input;  
  if(m_Comm.GetCommEvent()==2)//接收缓冲区内有字符  
  {  
  Input=m_Comm.GetInput();//读取缓冲区内的数据  
  CString   msg=Input.bstrVal;  
  CString   str;  
  str.Format("%c",10);  
  if(msg.Right(1)==str)  
  {  
  m_RecvData+=msg;  
  m_History.AddString(m_RecvData);  
  m_RecvData="";  
  }  
  else  
  m_RecvData+=msg;  
  }  
  }  
   
   
    当数据被接收到接收缓冲区后,对于字符可以从VARIANT型结构变量的bstrVal成员变量中获取,VARIANT数据结构相当复杂,并牵扯到COM(Component   Object   Model,组件对象模型)中的一些概念,具体详情请参阅Microsoft   Corpration发布的MSDN中的有关论述。  
   
  Top

2 楼ezway(高手的零头★★★★☆)回复于 2002-04-11 11:01:10 得分 8

roaringwind.best.163.com  
  有详细例程,和介绍  
  上去下吧!!!!Top

3 楼be_better(命犯天煞孤星)回复于 2002-04-11 11:02:59 得分 0

thanks   two   !  
  怎么给分呢???Top

4 楼load(不是东西)回复于 2002-04-11 11:08:07 得分 1

点右下角的“管理”进去就知道了   :)Top

相关问题

  • 串口操作类
  • win2000下的串口操作
  • win2000的串口操作
  • ----用CreateFile来操作串口?----
  • 多串口操作问题?
  • 操作串口的问题?
  • 串口的汇编操作
  • 谁有关于串口操作的类?
  • 谁愿提供串口操作程序!
  • 对串口操作的资料?

关键词

  • 函数
  • 控件
  • 数据
  • 字符
  • 线程
  • 属性
  • 端口
  • 代码
  • 串口
  • colecommview

得分解答快速导航

  • 帖主:be_better
  • redlight
  • ezway
  • load

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo