CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

关于COM串口缓冲区的问题,100分差不多了!!

楼主MiracleRecurrence(奇迹再现)2002-03-14 09:53:18 在 VC/MFC / 基础类 提问

 
  我接手别人的代码,看不懂,代码中与关于COM串口通讯的程序用的是Microsoft   Communications   Control,version   6.0控件  
   
    头文件MyComm.h  
    CMSComm   m_ctrlComm;//生成对象  
     
   
  执行文件MyComm.cpp  
  void   MyComm::OnComm()//消息响应函数,只要COM口有数据即触发此消息,接收数据  
      {  
          VARIANT   variant_inp=m_ctrlComm.GetInput();     //读缓冲区,将数据存入变量  
                                                                                                  //variant_inp  
              。。。。。。。。。。。。。。。  
      }  
       
  问题:  
      1、本人不理解的是,本缓冲区指什么缓冲区,是否在内存中?  
      2、本函数是消息响应函数,按理只要有数据就触发本函数,但是我跟踪本函数得到的结果是有时候得到的字符有3个,有时4个,就是说,不是有数据即触发,而是有时候是几个字符才开始触发,那么这些字符存在什么地方的? 问题点数:100、回复次数:4Top

1 楼ygd(人生短暂,及时行乐。准备成熟中)回复于 2002-03-14 10:07:29 得分 20

串口自己开的输入和输出缓冲,再内存中  
  如果有大量数据的话,可能是8字节触发,存放在输入缓冲内  
  Top

2 楼ylb_and_xy(黑狐狸)回复于 2002-03-14 10:10:41 得分 20

串口自己开的输入和输出缓冲,在内存中。  
  一般都不是一个一个的触发,一般是以包为单位。  
  Top

3 楼rovoboy(魂之猎人)回复于 2002-03-14 10:18:10 得分 20

看看这里,可能会有所帮助  
   
  BOOL   CDataDlg::OnInitDialog()    
  {  
  CDialog::OnInitDialog();  
   
  m_Send=false;  
  //   TODO:   Add   extra   initialization   here  
  if(m_ComCtrl.GetPortOpen())  
  m_ComCtrl.SetPortOpen(FALSE);  
   
  m_ComCtrl.SetCommPort(1);       //选择com1  
  if(   !m_ComCtrl.GetPortOpen())  
  m_ComCtrl.SetPortOpen(TRUE);//打开串口  
  else  
  AfxMessageBox("不能打开串口");  
   
  m_ComCtrl.SetSettings("2400,n,8,1");   //波特率2400,无校验,8个数据位,1个停止位  
  m_ComCtrl.SetInputMode(1);   //以二进制方式检到数据  
  m_ComCtrl.SetRThreshold(20);  
  //参数5表示每当串口接收缓冲区中有多于或等于5个字符时将引发一个接收数据的OnComm事件  
  m_ComCtrl.SetInputLen(40);     //设置当前接收区数据长度为0  
  m_ComCtrl.GetInput();//先预读缓冲区以清除残留数据  
   
  m_length=0;  
  return   TRUE;     //   return   TRUE   unless   you   set   the   focus   to   a   control  
                              //   EXCEPTION:   OCX   Property   Pages   should   return   FALSE  
  }  
  void   CDataDlg::OnComm()    
  {  
  static   int   ErrFlag1=0;  
  static   int   ErrFlag2=0;  
  VARIANT   variant_inp;  
  COleSafeArray   safearray_inp;  
  LONG   len,k;  
  // BYTE   rxdata[350];   //设置BYTE数组   An   8-bit   integerthat   is   not   signed.  
  CString   strtemp;  
  strtemp="fg";  
  if(m_Send==true)  
  {  
  m_Send=false;  
  CByteArray   Data;  
  Data.SetSize(1);  
  Data[0]=m_CtrlData;  
  m_ComCtrl.SetOutput(COleVariant(Data));  
  }  
  if(m_ComCtrl.GetCommEvent()==2)           //事件值为2表示接收缓冲区内有字符  
  {  
  variant_inp=m_ComCtrl.GetInput();       //读缓冲区  
  safearray_inp=variant_inp;                       //VARIANT型变量转换为ColeSafeArray型变量  
  len=safearray_inp.GetOneDimSize();   //得到有效数据长度  
  {  
  for(k=0;k<len;k++)  
  safearray_inp.GetElement(&k,m_rxdata+k);//转换为BYTE型数组  
  // AfxMessageBox((char*)rxdata,NULL,NULL);  
  m_length=len;  
  }  
  int tmp1;  
  int tmp2;  
  k=0;  
  ///以下为解码及滤波  
  while(  
  !(m_rxdata[k]==0xF0  
  &&m_rxdata[k+1]==0xF1)  
  &&k+5<m_length)  
  k++;  
  if(k+5>=m_length)  
  return;  
  tmp1=m_rxdata[k+2]*256+m_rxdata[k+3];  
  tmp2=m_rxdata[k+4]*256+m_rxdata[k+5];  
  m_ADData1=tmp1;  
  if(fabs(m_ADData1Last-m_ADData1)>=100&&ErrFlag1==0)  
  {  
  ErrFlag1=1;  
  m_ADData1=m_ADData1Last;  
  }  
  else  
  {  
  ErrFlag1=0;  
  }  
  m_ADData1Last=m_ADData1;  
  m_ADData2=tmp2;  
  if(fabs(m_ADData2Last-m_ADData2)>=100&&ErrFlag2==0)  
  {  
  ErrFlag2=1;  
  m_ADData2=m_ADData2Last;  
  }  
  else  
  {  
  ErrFlag2=0;  
  }  
  m_ADData2Last=m_ADData2;  
  m_Port=m_rxdata[k+6];  
  m_Port=m_Port&3;  
  m_JDQStat=m_rxdata[k+7];  
  m_length=0;  
  }  
  }  
   
  Top

4 楼denny97104(飞翔.风)回复于 2002-03-14 10:18:52 得分 20

CMSComm   m_ctrlComm;  
  m_ctrlComm.SetRThreshold(1);    
  //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件  
  Top

5 楼wangqipiao(老枪)回复于 2002-03-14 10:41:15 得分 20

缓冲区在内存里。缓冲区有多少个字符会触发?这要看通讯协议,基于字串的通信,当缓冲区接收到一个回车符时会触发,甚至不一定是回车符,可以是其它自定义的符号。Top

相关问题

  • 串口的缓冲区?
  • 请问怎么设置串口缓冲区的大小!
  • 有没有读串口缓冲区的命令啊
  • 非常规串口问题:如何把内存中的数据直接写入串口输入缓冲区?或者直接去读串口输出缓冲区?
  • MSCComm控件 一次只能读取串口缓冲区的8个字符???
  • 判断串口的缓冲区有数据的函数是什么。
  • Delphi里面如何清除串口的接收和发送缓冲区
  • 串口通信协议设计:请问一般串口的发送缓冲区的字节为多少
  • windows系统给串口提供的默认缓冲区是多大,用什么API函数取得这个值?
  • 为何我的串口每次只能接收8个字符? 是缓冲区吗?

关键词

  • 字符
  • 数据
  • 函数
  • 内存
  • 消息
  • addata
  • 缓冲区
  • 串口
  • comctrl
  • errflag

得分解答快速导航

  • 帖主:MiracleRecurrence
  • ygd
  • ylb_and_xy
  • rovoboy
  • denny97104
  • wangqipiao

相关链接

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

广告也精彩

反馈

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