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

C++ 实现简单的串口通讯 阅读详情

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

  一、引言

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


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

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

  事件驱动方式

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

  查询方式

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

  1.MSComm 控件的常用属性

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

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

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

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

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

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

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

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

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

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

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

  2.MSComm控件的事件
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控件加入到窗体中,然后再加入5个ComboBox用来设置串口的属性,4个Button分别用来"打开串口" "关闭串口""发送数据""保存数据" ,2个Memo控件分别用来显示接收到的数据和发送的数据。再加入一个Shape控件用来标明串口是否打开。

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

  Button1用来打开串口,Button2用来关闭串口,Button3用来发送数据,Button4用来保存数据。Memo1用来显示发送的数据,Memo2显示接收的数据。Shape1的Shape属性设置为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控件的Input和Output属性在Object Inspector中是看不到的,而且在C++Builder环境下这两个属性已不在是VB、VC中的原类型,而是OleVariant类型,也就是Ole万能变量,这就需要我们在发送接收数据时要把数据转换成Ole类型。

void __fastcall TForm1::Button3Click(TObject *Sender) file://发送Memo2中的数据
{
MSComm1->Output=StringToOleStr(Memo2->Text); file://把AnsiString型转化成//Ole形式。
}

  通过OnComm事件接收数据,必须把MSComm的RThreshold属性设置为大于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控件进行串行通信编程的实现和部分源码,有了上面的参照读者可以根据实际需要编写出具有发送文件和接收文件功能的程序。

SPCOMM控件C++Builder 5串行通信实践教程 串行通信,是指数据按照位的形式,一个接一个地在单个信道上进行传输。这种方式与并行通信不同,后者在同一时刻可以通过多条线路同时传输多位数据。串行通信的主要特点包括:成本效益:由于使用较少的线路,相对于并行通信,串行通信在硬件成本上更为经济。距离优势:适合长距离传输,因为单线传输的信号衰减问题较小。简单性:连接和硬件接口较为简单,易于实现。速度限制:由于是逐位传输,相对于并行通信,其速度受到一定限制,特别是在高频数据传输中更为明显。 阅读详情

相关推荐

C++Builder串口控件使用详解

在当今的IT行业中,串口通信作为硬件交互的重要方式,依然在多种领域中扮演着不可或缺的角色。BCB(Borland C++ Builder)作为一款经典开发工具,其内置的串口控件为开发者提供了一种便捷的串口编程手段。本章将对BCB串口控件进行概览,介绍其基本功能与应用场景。BCB串口控件是专门用于进行串口通信的组件,它封装了Windows API中的串口操作功能,使得开发者可以更容易地实现PC与外部设备之间的数据交互。

weixin_42588555的博客 980

C++ Builder串口通讯

工作中要用到串口开发,在网上找了一天也没有找到合适的。无奈之中,自己开发了一个。此软件带自动获得串口功能。只写了接收数据的部分,发送部分没有写。

C++Builder PComm串口控件安装与应用教程

C++Builder 是一款由 Embarcadero 公司开发的 C++ 集成开发环境(IDE),专注于快速应用程序开发(RAD)。它支持高效的开发体验,适合于开发 Windows 平台的应用程序,尤其是利用VCL(Visual Component Library)框架进行可视化组件编程。PComm串口控件是一款在Windows平台上广泛应用的串口通信软件开发工具。其核心作用在于为开发者提供了一种高效、稳定且简便的方式来实现与外部串行设备之间的数据交换。

weixin_33072399的博客 539

C++ Builer串口通讯例程

基于C++ Builer串口通讯,COM口设置,数据的读取和发送

C++builder串口通信设计(一)-串口接收数据

一、安装mscomm32.ocx控件 1、复制mscomm32.ocx到windows\system32\下 2、注册 二、在c++builder下引入mscomm32.ocx 选择菜单component->Import ActiveX Control, 选择“Microsoft Comm Control 6.0(Version1.1)”,点击“insta

niepangu的专栏 9529

C++串口通信

一、串口通信的基本原理 串口的本质功能是作为 CPU 和串行设备间的编码转换器。当数据从 CPU 经过串行端口发送出去时,字节数据转换为串行的位(bit);在接收数据时,串行的位被转换为字节数据。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。典型地,串口用于 ASCII 码字符的传输。通信使用3根线完成:地线,发送数据线,接收数据线。 串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行...

wy749929317的博客 1万+

C++ Builder串行通信控件编程

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

左超 2739

C++Builder中使用MSCOMM进行串口编程

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

xuecall的专栏 4800

博通蓝牙芯片上位机源代码 VC6.0 C++ MFC 源码

博通蓝牙芯片上位机源代码 VC6.0 C++ MFC 源码 很难找的资料

C++ builder 编写的串口工具

C++ builder 编写的串口工具使用MSComm 控件编写

C++ Builder 串口组件

很好,很稳定的串口组件!!!使用过好几个串口组件,这个最好用了,大家分享一下!!!

C++ builder 串行通信控件

C++ builder中做一个串行通信控件,实现与单片机的串行通信,希望对你有用,共同分享下。 附在C++ builder中生成exe文件并释放后可在没安装C++ builder的电脑上运行方法: 程序编译通过之后,选择Project-->Options  -build Project完成后按照以下步骤进行便可生成可在任意电脑上运行的可执行文件。 打开Project

363

C++ Builder MSComm 串口 编程

摘要:串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。本文介绍了在C++ Builder中如何利用串行通信控件进行串行通信编程。   一、引言   目前,在用计算机进行数据传输时,常用的是串行通信方式。用C++ Builder来编写串行通信程序时,可以调用Windows API函数,也可以利用VB中的MSComm控件利用 API函数编写实际应用程序时

ksrsoft的专栏 4225

c++ builder Api 串口 demo 发送数据

//调试通过 #include <vcl.h> #include <windows.h> #include <iostream> using namespace std; HANDLE hComm;bool InitSerialPort() { DCB dcb; String ComNo ="COM1"; //串口(COM1) 通信初始化 hComm =CreateFile (ComNo.c_str(),GENERIC_READ |GENERIC...

weixin_39926429的博客 978

C++ builder 多进程串口通讯程序1 (项目分析)

总体实现过程:1.数据接收块  2.接收数据处理块  3.数据发送块,4.进程通讯块              其中还有数据加密,电台译码,硬件操作指令选择等等 1. 数据协议= Head +Length+data1+data2+…+dataN+CheckSum

2175

关于在C++ Builder中串口通讯的经验之谈

第一次:开始的时候,我是因为BCB强大制作界面的功能吸引而抛弃了VB的,如果您也打算用BCB做串口的东西,那么,请好好看看我的经验。(我只谈串口部分),相信不少的人都知道在VB中有一个控件MSComm(图标是一个小黄电话),它可以帮你完成普通的串口传输功能(比如字符串什么的,但有的却实现起来比较烦琐),在BCB中要用VB的控件,我想很多人都知道怎么办,在菜单中点Component>Impo

左超 7392
上一篇: Socket编程中select()的妙用
下一篇: DM642 FVID驱动
henhen2002
博客等级 码龄17年 780粉丝 131原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值