博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

马二进三名人传记

yjx2003---linux
  yjx2003.cublog.cn

关于作者
mail: xjybook7###yahoo.com.cn
把3个# 换成 @ ,就是邮件地址
|| << >> ||
我的分类


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

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

 

摘要:串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。本文介绍了在C++ Builder中如何利用串行通信控件进行串行通信编程。

 

  一、引言

 

  目前,在用计算机进行数据传输时,常用的是串行通信方式。用C++ Builder来编写串行通信程序时,可以调用Windows API函数,也可以利用VB中的MSComm控件。 利用 API函数编写实际应用程序时,往往要考虑多线程的问题,这样编出来的程序不但十分庞大,而且结构比较复杂,继承性差,维护困难。但是使用串行通信控件就相对简单一些,而且功能强大,性能安全可靠。本文就简单的介绍一下在C++ Builder中利用MSComm控件进行编程。

 

  二、MSComm控件的常用属性和事件

 

  MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Eventdriven)方法,一是查询法。

 

  事件驱动方式

 

  在使用事件驱动法设计程序时,每当有新字符到达,或端口状态改变,或发生错误时,MSComm控件将解发OnComm事件,而应用程序在捕获该事件后,通过检查MSComm控件的CommEvent属性可以获知所发生的事件或错误,从而采取相应的操作。这种方法的优点是程序响应及时,可靠性高。

 

  查询方式

 

  查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。

 

  1.MSComm 控件的常用属性

 

  CommPort属性:设置或返回通讯端口号,可以设置为116之间的任何值,本系统采用缺省值2

 

  Settings属性:以字符串形式设置或返回波特率、奇偶校验、数据位和停止位,本系统采用缺省值"9600n81";

 

  PortOpen属性:设置或返回通讯口的状态以及打开和关闭端口,可通过把该属性设置为true或者false来打开或者关闭端口;

 

  InBufferSizeOutBufferSize属性:分别设置接收和发送缓冲区分配的内存数量,单位为字节,缺省值分别为1024byte512byte

 

  InputLen属性:确定希望从接收缓冲区移出的字符数量,当InputLen0时,一次把接收缓冲区的字符全部移出;

 

  Input属性:从接收缓冲区中读出数据,然后将该数据从缓冲区移走。

 

  OutPut属性:向发送缓冲区传递待发送的数据。

 

  InBufferCountOutBufferCount属性:分别确定当前驻留在接收缓冲区等待被取出和发送缓冲区准备发送的字符数量,这两个属性设置为0,接收和发送缓冲区的内容将被清除;

 

  InputMode属性:设置接收传入数据的格式,设置为0采用文本形式,设置为1采用二进制格式,本系统设置为二进制格式进行发送和接收;

 

  SThreshold属性:保存一个产生发送OnComm事件的界限值,本系统设置该属性为0,发送数据时不产生OnComm事件;

 

  RThreshold属性:设定当接收几个字符时触发OnComm事件,本系统设置该属性为1,每接收一个字符就产生一个OnComm事件;

 

  2MSComm控件的事件

MSCOMM控件只使用一个事件OnComm,用属性CommEvent的十七个值来区分不同的触发时机。主要有以下几个:

 

  (1)CommEvent=1时:传输缓冲区中的字符个数已少于Sthreshold(可设置的属性值)个。

 

  (2)CommEvent=2时:接收缓冲区中收到Rthreshold(可设置的属性值)个字符,利用此事件可编写接收数据的过程。

 

  (3)CommEvent=3时:CTS线发生变化。

 

  (4)CommEvent=4时:DSR线发生变化。

 

  (5)CommEvent=5时:CD线发生变化。

 

  (6)CommEvent=6时:检测到振铃信号。

 

  另外十种情况是通信错误时产生,即错误代码。

 

  三、程序的实现

 

  1.注册MSComm控件

 

  众所周知,C++Builder本身并不提供串行通讯控件MSComm,但我们却可以通过注册后直接使用它。启动C++Builder5.0后,然后选择C++Builder主菜单中的Component菜单项,单击Import Active Control命令,弹出Import Active窗口,选择Microsoft Comm Control6.0,再选择Install按钮执行安装命令,系统将自动进行编译,编译完成后即完成MSComm控件在C++Builder中的注册,系统默认安装在控件板的Active,接下来我们就可以像使用C++Builder本身提供的控件那样使用新注册的MSComm控件了。(前提条件是你的机子上安装了Visual Basic,或者有它的库)

 

  2.具体实现

 

  新建一个工程Project1,把注册好的MSComm控件加入到窗体中,然后再加入5ComboBox用来设置串口的属性,4Button分别用来"打开串口" "关闭串口""发送数据""保存数据" 2Memo控件分别用来显示接收到的数据和发送的数据。再加入一个Shape控件用来标明串口是否打开。

 

  ComboBox1用来设置串口号,通过它的Items属性设置1234四个列表项分别表示COM1,COM2,COM3,COM4口。ComboBox2用来设置波特率,ComboBox3用来设置奇偶校验位,ComboBox4用来设置数据位,ComboBox5用来设置停止位。他们的缺省值分别是9600n81

 

  Button1用来打开串口,Button2用来关闭串口,Button3用来发送数据,Button4用来保存数据。Memo1用来显示发送的数据,Memo2显示接收的数据。Shape1Shape属性设置为stCircle

下面给出部分源码:

 

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

if(MSComm1->PortOpen==true)

{

Button1->Enabled=false;

Button2->Enabled=true;

Button3->Enabled=true;

Button4->Enabled=true;

Shape1->Brush->Color=clGreen;

}

else

{

Button2->Enabled=true;

Button2->Enabled=false;

Button3->Enabled=false;

Button4->Enabled=false;

Shape1->Brush->Color=clRed;

}

}

void __fastcall TForm1::Button1Click(TObject *Sender) / /打开串口

{

if(MSComm1->PortOpen!=true)

{

MSComm1->CommPort=StrToInt(ComboBox1->Text);//选择串口号

MSComm1->Settings=

ComboBox2->Text+","+

ComboBox3->Text+","+

ComboBox4->Text+","+

ComboBox5->Text; file://设置串口的属性波特率、奇偶校验、数据位和、//停止位。

MSComm1->InputMode=0;//设置传入数据的格式,0表示文本形式

MSComm1->PortOpen=true;//打开串口

Button1->Enabled=false;

Button2->Enabled=true;

Button3->Enabled=true;

Button4->Enabled=true;

Shape1->Brush->Color=clGreen;

}

}

void __fastcall TForm1::Button2Click(TObject *Sender) / /关闭串口

{

if(MSComm1->PortOpen!=false)

{

MSComm1->PortOpen=false;

Button1->Enabled=true;

Button2->Enabled=false;

Button3->Enabled=false;

Button4->Enabled=false;

Shape1->Brush->Color=clRed;

}

else

{

Button1->Enabled=false;

Button2->Enabled=true;

Shape1->Brush->Color=clRed;

}

}

 

  MSComm控件的InputOutput属性在Object Inspector中是看不到的,而且在C++Builder环境下这两个属性已不在是VBVC中的原类型,而是OleVariant类型,也就是Ole万能变量,这就需要我们在发送接收数据时要把数据转换成Ole类型。

 

void __fastcall TForm1::Button3Click(TObject *Sender) file://发送Memo2中的数据

{

MSComm1->Output=StringToOleStr(Memo2->Text); file://AnsiString型转化成//Ole形式。

}

 

  通过OnComm事件接收数据,必须把MSCommRThreshold属性设置为大于0,只有这样在接收到字符时才会产生一个OnComm事件。

 

void __fastcall TForm1::MSComm1Comm(TObject *Sender)

{

AnsiString str; file://声明一个AnsiString类型的变量

OleVariant s; file://声明一个用于接收数据的OleVariant变量。

if(MSComm1->CommEvent==comEvReceive)

// 接收缓冲区中是否收到Rthreshold个字符。

{

if(MSComm1->InBufferCount)// 是否有字符驻留在接收缓冲区等待被取出

{

s=MSComm1->Input;//接收数据

str=s.AsType(varString); file://把接收到的OleVariant变量转换成AnsiString类型

Memo1->Text=Memo1->Text+str;//把接收到的数据显示在Memo1中。

}

}

}

 

  要保存数据应该再加入一个SaveDialog模块

 

void __fastcall TForm1::Button4Click(TObject *Sender)

file://Memo1中的数据保存在指定的文件中

{

AnsiString filename1;

SaveDialog1->Filter="Text files (*.txt)|*.txt|All files (*.*)|*.*";//文件类型过滤器

SaveDialog1->FilterIndex=2;

if(SaveDialog1->Execute())

{

filename1=SaveDialog1->FileName;

Memo1->Lines->SaveToFile(filename1);//把收到的数据保存在文件filename1

}

}

 

  四、结束语

 

  上面给出了C++ Builder中利用MSComm控件进行串行通信编程的实现和部分源码,有了上面的参照读者可以根据实际需要编写出具有发送文件和接收文件功能的程序。

卓越网上书城 C++Builder及计算机 相关图书
C++ Builder网络编程核心技术
市场价: ¥31
卓越价: ¥23
VIP价: ¥22.4
从卓越亚马逊购买

 

C++ Builder案例开发集锦(附光盘)/商业开发代码库系列
市场价: ¥40
卓越价: ¥31.5
VIP价: ¥31.5
从卓越亚马逊购买

 

C++ Builder项目开发实践(附光盘)/项目开发实践系列丛书
市场价: ¥45
卓越价: ¥35
VIP价: ¥35
从卓越亚马逊购买

 

C++ Builder数据库开发经典案例解析(附光盘)/经典案例解析
市场价: ¥48
卓越价: ¥35.9
VIP价: ¥35.9
从卓越亚马逊购买

 

Java网络编程精解
市场价: ¥55
卓越价: ¥41.2
VIP价: ¥41.2
从卓越亚马逊购买

 

Java编程思想(第4版)
市场价: ¥108
卓越价: ¥75.5
VIP价: ¥77.4
从卓越亚马逊购买

 

CSS网站布局实录 基于Web标准的网站设计指南(第二版)
市场价: ¥39
卓越价: ¥26.6
VIP价: ¥26.7
从卓越亚马逊购买

 

C#2005 &.NET 3.0高级编程(第5版)上下卷(第一本面向.NET 3.0的C#经典名著!)
市场价: ¥158
卓越价: ¥118.3
VIP价: ¥114.8
从卓越亚马逊购买

 

算法导论(原书第2版)
市场价: ¥85
卓越价: ¥63.2
VIP价: ¥63.6
从卓越亚马逊购买

 

PHOTOSHOP CS/CS2 WOW!BOOK
市场价: ¥138
卓越价: ¥104.1
VIP价: ¥104.8
从卓越亚马逊购买

 

 

====================================================
====================================================

订阅免费电子杂志〈名人传记〉

每期发送电子图书,广读博览融汇贯通。阅读电子书时,请注意保护视力。╭○═○╮╭◎═◎╮╭●═●╮同步发行《名人传记简装版》简装版只包含附件联接地址,大小控制在80k以内。同时发送《热点》期刊

 

1 邮件订阅方式
向下面的邮件地址发一封信,邮件正文(不是标题)填写subscribe zhuanji
邮件地址  bentium@list.bentium.net

1.主页订阅

主页地址一 

http://list.cn99.com/cgi-bin/getlsts?listname=zhuanji

主页地址二   http://yjxsuccess.blog.hexun.com/

马二进三名人传记搏客 yjx2003.cublog.cn
向潜规则低头 图书 计算机基础应用 思路 杂文 linux c++ builder VB.NET tinyOS and eclipse

发表于: 2008-02-17,修改于: 2008-02-17 21:12,已浏览505次,有评论0条 推荐 投诉


网友评论
 发表评论