资讯   |   开发   |   选机中心   |   产品大全 | IBM | 惠普 | 联想 | 戴尔 | 苹果 | 神舟
更多: | 华硕 | 明基 | 方正 | 紫光 | TCL | 夏新 | 联宝 | 宏碁 | 七喜 | 长城 | 清华同方 | 海尔 | 三星 | 东芝 | 索尼 | 富士通 | LG | 技术 | ddnoon
当前位置:笔记本 > 软件开发 >
Advertisement
文章正文

求助:MSComm32控件接收问题?(加急)

类型:转载   责任编辑:asp.net   日期:2007/05/23


热门软件下载:


   

接收上位机发送来的应答帧#F8  
  OleVariant   RxBuff;  
  int   ByteNum;  
                                                                                                说明  
          if(MSComm1->InBufferCount>0)     //运行时MSComm1->InBufferCount的值为1  
          {  
                  MSComm1->InputMode   =1;  
                  RxBuff=MSComm1->Input;         //接收时的数据是错的或没收到数据,要怎么接收才正确啊?  
                  ByteNum=   RxBuff.ArrayHighBound(1);     //ByteNum的值为0,说明没收到数据  
                  for(int   i=0;i<ByteNum+1;i++)  
                  {  
                      buff[i]=RxBuff.GetElement(i);            
                  }  
          }

网友回答:

发表者:Friecin

http://vip.6to23.com/NowCan1/csdn/BCB_TIPS/cb_tip29.htm  
  关于在C++   Builder中串口通讯的经验之谈    
   
     
   
  我一直都是玩单片机的,所以从来没有因为串口传输数据而担心发愁过,不过,现在的社会,现在的人对所用的东西要求越来越高了,连部队也是如此,搞军用飞机电台的我们已经远远跟不上要求,这不,由于飞行员在空中操作飞机时候是没有可能抱着电台用手工的方法来输入参数的,所以他们会要求有一种类似IC卡的东东,只要在天上把卡一插,一切电台参数全部搞定,呵呵,好了书归正转,谈谈关于利用串口实现可靠通讯的心得。  
   
     
   
  首先,我想声明的是本人并不是什么C,C++,BCB的高手,只不过为了混饭吃必不得已才用上了BCB。  
   
     
   
  我真的要开始讲了,BCB中并没有直接提供什么很方便的东东来帮助你快速的实现串口通讯而且也很少有资料可以提供给你。我先谈谈我在我的项目中是如何应用的。  
   
     
   
  第一次:开始的时候,我是因为BCB强大制作界面的功能吸引而抛弃了VB的,如果您也打算用BCB做串口的东西,那么,请好好看看我的经验。,相信不少的人都知道在VB中有一个控件MSComm,它可以帮你完成普通的串口传输功能,在BCB中要用VB的控件,我想很多人都知道怎么办,在菜单中点Component&#0;>Import   ActiveX   Control在打开的框中找到你想要的Microsoft   Comm   Control6.0然后直接安装就可以了,注意,前提是你必须要装了VB或者有它的库,否则你可找不到的然后你就可以在组件板的Activex中看到一个小黄电话的图标了。它是不可见的控件,它有不少属性,不过我认为最关键的几个属性就是CommPort---设置或返回通讯端口号。Settings---以字符串形式设置或返回波特率、奇偶校验、数据位和停止位。PortOpen---设置或返回通讯端口的状态,以及打开和关闭端口。Input---从接收缓冲区返回和删除字符。Output  
   
     
   
  ---向缓冲区写一个字符串。这五个属性就可以帮你完成简单的串口传送接收下边我将介绍一下怎么来用这个控件,以及在程序中怎么组织程序。首先,你要建立一个新的工程,然后把MSComm控件放到窗体上,别忘了再放一个Button控件(Name属性就是Button1)。好了,双击Button1,得到如下:  
   
     
   
   
   
     
   
  #include   <vcl.h>  
   
     
   
  #pragma   hdrstop  
   
     
   
     
   
  #include   "Unit1.h"  
   
     
   
  //---------------------------------------------------------------------------  
   
     
   
  #pragma   package(smart_init)  
   
     
   
  #pragma   resource   "*.dfm"  
   
     
   
  TForm1   *Form1;  
   
     
   
  AnsiString   buff[10];   //****************************声明了一个缓冲,请注意,一定要设置为全局变量  
   
     
   
  //---------------------------------------------------------------------------  
   
     
   
  __fastcall   TForm1::TForm1(TComponent*   Owner)  
   
     
   
  :   TForm(Owner)  
   
     
   
  {  
   
     
   
  }  
   
     
   
  //---------------------------------------------------------------------------  
   
     
   
     
   
  void   __fastcall   TForm1::Button1Click(TObject   *Sender)   在此加入程序代码  
   
     
   
  {  
   
     
   
  MSComm1->CommPort=1;  
   
     
   
  MSComm1->Settings="9600,N,8,1";  
   
     
   
  MSComm1->PortOpen=true;  
   
     
   
  for(int   i=0;i<=9;i++)  
   
     
   
  {  
   
     
   
  buff[i]=i;  
   
     
   
  MSComm1->Output=buff[i];  
   
     
   
  }  
   
     
   
  MSComm1->PortOpen=false;  
   
     
   
  }  
   
     
   
  //---------------------------------------------------------------------------  
   
     
   
  运行此程序,当你点击按钮后,会发送数据  
   
     
   
  下面,我来解释一下上边的程序:  
   
     
   
  MSComm1->CommPort=1;这句程序是用来确定你将用哪一个串口实行你的通讯传输,我在这里选择是串口1  
   
     
   
   
   
     
   
  MSComm1->Settings="9600,N,8,1";这句程序是用来设置污七杂八的东东的,我在程序中设置的波特率为9600,N为无奇偶校验,数据位为8,停止位为1。  
   
     
   
  MSComm1->PortOpen=true表示将你设置好的串口1打开  
   
     
   
  接着我用了一个循环语句,也就是i从0到9这十个数分别放到您所定义的缓冲区内,这个缓冲的大小是由你自己来决定,再次提醒,必须为全局变量。  
   
     
   
  MSComm1->Output=buff[i];就是将数据发送出去。  
   
     
   
  最后别忘了将串口1关闭就行,语句就是MSComm1->PortOpen=false;  
   
     
   
  这就完成了传的工作,我在这里所讲的都是最简单的应用,不过万变不离其踪,您需要怎么传您就怎么做就可以了:)  
   
     
   
  我想说的还有MSComm的Output属性后边要求必须是Olevariant的,我叫这种变量为万能变量,,用这个控件在传送过程中其实传送的都是  
   
     
   
  AnsiString对于一般的传送要求都可以满足了,但是对于有着特殊要求的传送,VB的这个控件可是爱莫能助的。比如要传送八进制、十六进制的数据,用这个方法传送的数据是错误的。因为当你无论是用C语言中的0X还是用BCB中的IntToHex()将数据转化为十六进制的数据,但传送出去的实际数据却是不正确的,。那么怎么办呢?我想最有效的方法还是来借助API函数帮助我们,这很有效的。下面我来介绍一下我借助API函数实现十六进制数据的传送。  
   
     
   
  第二次.用VB的MSComm控件我实现不了对十六进制数据的传送,于是,我就借助了API函数,很多人都知道在API函数中有这么两个函数CreareFile和WriteFile  
   
     
   
  至于这两个函数的具体东西,大家在实际应用中去查一下就行,我不多说了。  
   
     
   
  首先还是请您创建一个工程,在窗体上放上Button控件,双击,在里边按如下形式加如代码即可。  
   
     
   
  void   __fastcall   TForm1::Button1Click(TObject   *Sender)  
   
     
   
  {  
   
     
   
  HANDLE   hCom=CreateFile("COM1",  
   
     
   
  GENERIC_READ   |   GENERIC_WRITE,  
   
     
   
  0,  
   
     
   
  NULL,  
   
     
   
  OPEN_EXISTING,  
   
     
   
  0,  
   
     
   
  NULL);  
   
     
   
  if(hCom)  
   
     
   
  {  
   
     
   
  DCB   dcb;  
   
     
   
  ZeroMemory(&dcb,sizeof(dcb));  
   
     
   
  dcb.DCBlength=sizeof(dcb);  
   
     
   
  dcb.BaudRate=9600;  
   
     
   
  dcb.ByteSize=8;  
   
     
   
  dcb.Parity=NOPARITY;  
   
     
   
  dcb.StopBits=ONESTOPBIT;  
   
     
   
  if(SetCommState(hCom,&dcb))  
   
     
   
  {  
   
     
   
  DWORD   ByteCount;  
   
     
   
  int   *msg;  
   
     
   
  int   a[6]=   {4,4,   A,A,30,   0}  
   
     
   
  for(msg=a;msg<(a+10);msg++)  
   
     
   
  WriteFile(hCom,msg,1,&ByteCount,NULL);  
   
     
   
  }  
   
     
   
  CloseHandle(hCom);  
   
   
     
   
  }  
   
     
   
  }  
   
     
   
  关于两个函数的参数到底是怎么用的,大家可以很方便的就能查到,我只想请您注意在定义指针时一定要细心些,否则你可能产生错误,上边的程序只是完成了传送了一个十六进制的F0,如果你要传送字符串,那么你把程序稍加改动即可。例如发送HELLO,我给出程序  
   
     
   
  void   __fastcall   TForm1::Button1Click(TObject   *Sender)  
   
     
   
  {  
   
     
   
  HANDLE   hCom   =   CreateFile("COM1",  
   
     
   
  GENERIC_READ   |   GENERIC_WRITE,  
   
     
   
  0,  
   
     
   
  NULL,  
   
     
   
  OPEN_EXISTING,  
   
     
   
  0,  
   
     
   
  NULL   );  
   
     
   
     
   
  if(hCom)  
   
     
   
  {  
   
     
   
  DCB   dcb;  
   
     
   
  ZeroMemory(&dcb,   sizeof(dcb));  
   
     
   
  dcb.DCBlength   =   sizeof(dcb);  
   
     
   
     
   
  dcb.BaudRate   =   9600;  
   
     
   
  dcb.ByteSize   =   8;  
   
     
   
  dcb.Parity   =   NOPARITY;    
   
     
   
  dcb.StopBits   =   ONESTOPBIT;    
   
     
   
  if(SetCommState(hCom,&dcb))  
   
     
   
  {  
   
     
   
  DWORD   ByteCount;  
   
     
   
  const   char   *msg   =   "HELLO";  
   
     
   
  WriteFile(hCom,msg,   strlen(msg),&ByteCount,NULL);  
   
     
   
  }  
   
     
   
  CloseHandle(hCom);  
   
     
   
  }  
   
     
   
  }  
   
     
   
  请同志们把两个程序比较一下,其实很多东西就会明白的。  
   
     
   
     
   
  好了,关于串口通讯的我就讲这么多,当然这只是个皮毛,而且对于接收数据我没有提到,我想明白了发送,接收程序对于大家也不会是什么困难的事情。具体的应用还要看你们实际中的要求,要求变了,程序当然要变,不变的就是原理。通过这次所做的串口通讯程序,有了以上的一些心得,拿来与大家共同讨论,也是为了感谢象抱雪这样同志,为我们大家创造了交流的机会。希望我的心得能对大家有所帮助,如果有什么想法,可以与我联系。  
   
     
   
  E   -mail   :cokky-boy@yeah.net  
   
     
   
  cokkey-boy@163.com  
   
     
   
  电话:0917-3624411转656   13088908598   95950-8997108  
   
     
   
  地址:军品设计所  
   
     
   
  胡晓明  
   
     
   
  以上例子都是在BCB5.0,BCB4.0   WINDOWS98/ME下运行通过的。


 

 
热门推荐笔记本: IBM笔记本
相关文章:
webmaster:popbb@126.com   最佳浏览:1024X768 MSIE
©2007 popbb.net All Rights Reserved