用C++ Builder编程实现串行通信

用C++ Builder来编写串行通信程序, 我们需要用到几个Windows API函数,而不象在DOS 下那样直接操作串口和中断芯片.这几个函数有OpenFile, CloseFile, GetCommState, SetCommState等,Microsoft的Visual Basic中有一个OCX控件MSComm32,在VB用它做串行通信设备很方便, 将它装入Builder 3中, 它的Input和Ouput属性是Unknown, 即 Builder 3不认识MSComm32的这两个属性, 我们升级到Borland的C++ Builder 4.0,在 Object Inspector中将不再看到这两个属性, 但它们仍然存在, 这两个属性的类型是 OleVariant,也就是Ole万能变量,使用这种类型的方法如下:

在要发送数据时,我们声明一个发送数据缓冲区,然后重置它的大小,填充它的元 素,发送它,例如:

buff[200];  //请声明为全局变量

OleVariant TxBuff;  //声明一个OleVariant变量

Txbuff=VarArrayCreat(OPENARRAY(int,(0,n)),varByte); //重置它的大小,为0~n,int为n的类型,varByte为TxBuff每一个元素的类型。

for(int i=0;i<n=1;i++)

Txbuff.PutElement(buf[i],i);  //填充元素其中buff为你定义的一个固定数组,其中有你要发的数据

MsComm1->Output=TxBuff;  //发送数据,MSComm1为你方在窗体上的一个MSComm32控件。

接收数据时请看下面的例子:

int buff[200];  //声明一个存储接收数据的缓冲区,全局变量<br>
int ByteNum;  //收到的字节数
int BuffPtr;  //接收缓冲区的指针,请声明为全局变量。
OleVariant RxBuff;  //一个用于接收的OleVariant变量。
if(MSComm1-> InBuffCount>0)
RxBuff=Communica1->Input;  //如果缓冲区有多于一个字节的数据
ByteNum=RxBuff.ArrayHighBound(1);  //将实际读的字节数取出
for(int i=0;i<=ByteNum;i++)<br>
{
 buff[BuffPtr++]=RxBuff.GetElement(i);
}

//将接收数据读入自己的缓冲区。

在Object Inspector的Event标签中只有一个事件OnComm, 这个事件在MSComm32控件接收到数据时会被调用,但你必须设置TThreshold属性,这是一个门槛,表示收到几 个字节就发送通知消息,如果为零,就不发送通知消息,这样你的OnComm函数就不会得 到执行,TThreshold是发送门槛,不要忘记Setting。

另外值得注意的是MSComm32的OnComm事件不是很准确,有时会丢失,你不能过分依 赖这个事件,否则,经常发生的不是发不出数据,就是接收不到数据,最好的办法是使 用一个定时控件,需要的时候就区读MSComm32控件的缓冲区。

时间: 2024-10-28 12:00:44

用C++ Builder编程实现串行通信的相关文章

在 C++ Builder中利用串行通信控件编程

摘要:串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛.本文介绍了在C++ Builder中如何利用串行通信控件进行串行通信编程. 一.引言 目前,在用计算机进行数据传输时,常用的是串行通信方式.用C++ Builder来编写串行通信程序时,可以调用Windows API函数,也可以利用VB中的MSComm控件. 利用 API函数编写实际应用程序时,往往要考虑多线程的问题,这样编出来的程序不但十分庞大,而且结构比较复杂,继承性差,维护困难.但是使用串行通信控

C++ Builder编程指南1

Borland C++ Builder(以下简称C++ Builder)是由Borland公司 继Delphi之后又推出的一款高性能可视化集成开发工具.C++ Builder具有快速的可视化开发环境:只要简单地把控件(Component)拖到窗体(Form)上,定义一下它的属性,设置一下它的外观,就可以快速地建立应用程序界面:C++ Builder内置了100多个完全封装了Win95公用特性且具有完全可扩展性(包括全面支持ActiveX控件)的可重用控件:C++ Builder具有一个专业C++

C++ Builder编程指南2

三.常用控件的使用与编程 静态文本是用户无法直接改变(不可编辑)的文本,程序可以在运行时刻来改变它,通常起标注和提示作用,它位于控件板的"Standard"页,其主要属性有: Align:指该控件在窗口中的位置或对齐方式(AlBottom:位于底部:AlClient:充满客户区:AlLeft:位于左方:AlNone:用户自定义:AlRight:位于右方:AlTop:位于顶部). Alignment:显示文字在本控件中的位置(taCenter:居中:taLeftJustify:居左:ta

C++builder编程修改注册表的问题

RootKey是注册表的根键值,比如运行regedit后看到的HKEY_USERS,HKEY_LOCAL_MACHINE就是RootKey,在TRegIniFile中缺省的RootKey是HKEY_USERS. 下面的例子是TRegistry的,TRegIniFile也差不多 void __fastcall TfrmMainForm::WriteToMyRegistry(int table_count) { //TODO: Add your source code here TRegistry

Borland C++ Builder专题

BCB中如何给Table减肥 C++ Builder开发经验几则 C++ Builder在运行时创建BDE别名 C++ Builder常用代码片断 C++ Builder实现在线接收电子邮件 C++ Builder动态设定odbc数据源 如何利用C++ Builder实现对Excel97 的调用 BCB创建基于Internet的点对点Chat 用C++ Builder开发Web程序 用BCB开发多层数据库应用程序 用C++ Builder编写自已的IE SKIN 用BCB5的打包程序打包BCB6

C++ Builder数据库综合开发实践

一套原来在Access上开发的桌面系统,网页调阅使用ASP编程,数据维护系统使用C++Builder编程.由于Access是一个桌面的共享型数据库,所以在通用性和网络开发方面都存在一些问题.因此,需要将该系统移植到服务器型的数据库上.使系统既可以通过桌面软件维护数据,又可以有大量用户通过网页调看数据(结果). 系统初始软件为:Windows98第二版.Access97.C++Builder4.0.C++Builder5.0.MDAC(Microsoft Data Access Component

在C++ Builder中取得命令行参数

用过C语言编程的人都知道,在DOS下的编程可以通过main函数的参数取得命令行参数的个数以及每个参数的字符串,例如 int main(int argv ,char *argv[]) { - } 则命令行参数是argc个,这些参数分别存储在argv[0]-argv[argc-1]中,其中argv[0]是可执行文件的名字(含路径),那么Windows程序是怎么取得命令行参数的呢?用C语言写过windows程序的人都知道,在windows程序的主函数WinMain()中,有一个参数lpszCmd,这个

数据库综合开发实践

数据|数据库 数据库综合开发实践马磊.张万里 一套原来在Access上开发的桌面系统,网页调阅使用ASP编程,数据维护系统使用C++Builder编程.由于Access是一个桌面的共享型数据库,所以在通用性和网络开发方面都存在一些问题.因此,需要将该系统移植到服务器型的数据库上.使系统既可以通过桌面软件维护数据,又可以有大量用户通过网页调看数据(结果).系统初始软件为:Windows98第二版.Access97.C++Builder4.0.C++Builder5.0.MDAC(Microsoft

将窗体从属于主窗体

几乎所有正式一点的C++ Builder程序除了主窗体外都还有从属窗体,有时是对话框,有时是无模式窗口.VCL使得创建和显示从属窗体都易如反掌.但不是所有程序都适于采用无模式窗体,有些程序需要在一个主窗体内显示不同的内容.本文讨论如何将一个从属窗体"寄居"于主窗体中,从属窗体看上去是主窗体的一部分,用户甚至不知道一个从窗体正被显示.图A显示了一个主窗体,其客户区是一个从窗体. 理解子/父联系 这类程序的基本思路是让所有从属窗体都作主窗体的子窗体,这种设计在其他框架(如OWL或MFC)中