利用VC实现网络通信

2024-06-14

利用VC实现网络通信(精选七篇)

利用VC实现网络通信 篇1

数据库编程是VC编程中的重要组成部分,利用数据库技术程序开发者可以编写出功能更加强大的应用软件,要实现对大量数据的访问、修改、存储等操作,利用DataGrid控件是个不错的选择[1]。一般情况下,DataGrid控件并不单独使用,而是与ADO Data控件联合使用,利用ADO Data控件建立与数据源之间的连接,再利用DataGrid控件显示数据源数据,从而实现DataGrid控件与数据源之间的动态连接与数据绑定(DATA BINDING)。

下面结合实例来说明VC中利用DataGrid控件实现数据绑定的方法。数据库采用微软Microsoft Access系统,数据库文件名为students.mdb,其中有1个名为Basic的表,文件存放在E:shujuku目录下。

1 DataGrid控件的加载

利用VC++中的MFCAppWizard向导创建一个项目名称为zkntest的基于对话框的应用程序。在第二步中务必将ActiveX Controls可选项勾选,然后在工具栏中依次点击Project->add to project->components and controls,在弹出的对话框中双击Registered ActiveX Controls,在其控件列表中选择Microsoft DataGrid Control 6.0(SP6)(OLEDB),点击insert,接下来的每一步都点确认按钮(ok按钮)。这时我们发现在工具箱中多了一个DataGrid控件的图标,拖动该图标到对话框中,并且调整其大小,设置属性为AllowAddNew、AllowDelete、AllowUpdate、ColumnHeaders、Enabled,完成此控件的加载[2],加载后控件的ID号为“IDC_DATAGRID1”。接着按同样的方式插入ADO Data控件,只是在弹出的控件列表中选择Microsoft ADO Data Control 6.0(SP6)(OLEDB),加载后控件的ID号为“IDC_ADODC1”,这样,DataGrid控件和ADO Data控件均加载完成。

2 数据绑定

在对话框上布置好控件后,要对其进行必要的设置才能实现与数据源的动态绑定,首先设置ADO Data控件,在其“Properties”页面中,选择“Control”标签,选中“Use ODBC Data Sourse Name”选项,在其下拉列表中选择“zkn”数据源名称,设置页面见图1;再选择“RecordSource”标签,在“Table or Stored Procedure Name”下拉列表中选择“Basic”(表名),其他选项可根据需要自行设定[3],设置页面见图2。

接着设置DataGrid控件,在其“Properties”页面中,选择“All”标签,在“DataSource”选项里选择ADO Data控件的ID号“IDC_ADODC1”,这样就将DataGrid控件和ADO Data控件联系起来,设置界面见图3。

上面的名为“zkn”的数据源必须在程序运行前或程序启动时加以注册,未经注册的数据源是无法使用的,手动注册数据源不够灵活,且项目的可移植性不够好,本例中使用SQLConfigDataSource函数自动注册数据源。

在zkntestDlg.cpp文件中添加头文件#include“ODBCINST.h”(SQLConfigDataSource函数所在头文件),然后修改CZkntestDlg::OnInitDialog()函数,并增加部分代码,程序源代码如下:

最后,对程序进行编译、连接,注意使用“Use MFC in a Static Library”方式,生成可执行文件zkntest.exe。

3 ActiveX控件注册

以上通过静态编译产生的zkntest.exe文件在本地机器上(装有VC++开发系统)可以正常运行,但在测试机上(未装VC++开发系统)无法正常运行,原因是DataGrid控件均属于ActiveX控件,一般来说,一个外来ActiveX控件要在Windows中被正确使用,首先必须将控件文件(*.OCX)复制到硬盘中,然后将其在Windows中注册,未在Windows中注册过的ActiveX控件是不能使用的。注册ActiveX控件一般来说有3种途径:(1)使用Regsvr32.exe程序对ActiveX控件进行注册;(2)使用安装程序;(3)在应用程序中加入注册代码。本例中采用Inno setup软件制作安装程序并完成ActiveX控件的注册。

Inno setup是一个免费的、优秀的安装制作工具,它的编程语言是文本格式,可以在任意文本环境下编写,并在Inno setup环境下编译[4]。使用Inno setup安装程序制作软件时,将zkntest.exe文件、MSADODC.OCX、MSDATGRD.OCX、msstdfmt.dll一同打包,制作成软件安装程序,并在其脚本文件中的[Files]字段中加入如下语句:

完成编译后,即可生成软件安装程序,在测试机上安装后,MSADODC.OCX、MSDATGRD.OCX、msstdfmt.dl三个文件将被自动注册,并被安装进C:WIN-DOWSsystem32文件夹中,程序运行后的最终结果见图4。

4 结论

(1)利用DataGrid控件可以实现应用程序与Access数据库文件的动态绑定,对Access数据库文件的编辑修改结果可以直接反映在程序界面上;同样可以在DataGrid控件上直接对Access数据库文件.mdb进行添加、删除、修改等操作。

(2)数据源需进行注册后才能使用,注册可以采用ODBCINST.h头文件中的SQLConfigDataSource函数编写程序代码实现。

(3)利用DataGrid控件实现数据绑定,最关键的是要对控件文件MSADODC.OCX、MSDATGRD OCX,以及系统文件msstdfmt.dll进行注册,否则无法正常显示。

文中程序已在Windows XP Professional下,由Microsoft Visual C++6.0编译调试通过。

参考文献

[1]崔莹,王华军,姚雪峰.Visual C++数据库使用编程100例[M].北京:中国铁道出版社,2007.

[2]王守强,朱大铭.在VC中使用DataGrid控件[J].电脑编程技巧与维护,2002(8):46~49.

[3]求是科技王正军.Visual C++6.0程序设计从入门到精通[M].北京:人民邮电出版社,2006.

利用VC实现网络通信 篇2

湖南大学(长沙410082) 于小亿 王 辉 张志学

摘 要 详细介绍了在Windows环境下应用VC++实现PC机与单片机的几种串行通信方法,给出了用Visual C++6.0编写的PC机程序和用C51编写的单片机通信程序。经实际应用系统运行稳定可靠。

关键词 Visual C++ 类 串行通信

工业控制领域(如DCS系统),经常涉及到串行通信问题。为了实现微机和单片机之间的数据交换,人们用各种不同方法实现串行通信,如DOS下采用汇编语言或C语言,但在Windows 环境下却存在一些困难和不足。在Windows操作系统已经占据统治地位的情况下(何况有些系统根本不支持DOS如Windows2000)开发Windows 环境下串行通信技术就显得日益重要。

VC++6.0是微软公司于1998年推出的一种开发环境,以其强大的功能,友好的界面,32位面向对象的程序设计及Active X的灵活性而受广大软件开发者的青睐,被广泛应用于各个领域。应用VC++开发串行通信目前通常有如下几种方法:一是利用Windows API通信函数;二是利用VC的标准通信函数_inp、_inpw、_inpd、_outp、_outpw、_outpd等直接对串口进行操作;三是使用Microsoft Visual C++的通信控件(MSComm);四是利用第三方编写的通信类。以上几种方法中第一种使用面较广,但由于比较复杂,专业化程度较高,使用较困难;第二种需要了解硬件电路结构原理;第三种方法看来较简单,只需要对串口进行简单配置,但是由于使用令人费解的VARIANT类,使用也不是很容易;第四种方法是利用一种用于串行通信的CSerial类(这种类是由第三方提供),只要理解这种类的几个成员函数,就能方便的使用。笔者利用CSerial类很方便地实现了在固定式EBM气溶胶灭火系统分区启动器(单片机系统)与上位机的通信。以下将结合实例,给出实现串行通信的几种方法。

1 Windows API通信函数方法

与通信有关的Windows API函数共有26个,但主要有关的有:

CreateFile() 用 “comn”(n为串口号)作为文件名就可以打开串口。

ReadFile() 读串口。

WriteFile() 写串口。

CloseHandle() 关闭串口句柄。初始化时应注意CreateFile()函数中串口共享方式应设为0,串口为不可共享设备,其它与一般文件读写类似。以下给出API实现的源代码。

1.1 发送的例程

//声明全局变量

HANDLE m_hIDComDev;

OVERLAPPED m_OverlappedRead, m_Over lappedWrite;

//初始化串口

void CSerialAPIView::OnInitialUpdate()

{

CView::OnInitialUpdate();

Char szComParams[50];

DCB dcb;

Memset(&m_OverlappedRead, 0, sizeof (OVERLAPPED));

Memset(&m_OverlappedWrite, 0, sizeof (OVERLAPPED));

m_hIDComDev = NULL;

m_hIDComDev = CreateFile(“COM2”, GENERIC_READ│GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL│FILE_FLAG_OVERLAPPED, NULL);

if (m_hIDComDev == NULL)

{

AfxMessageBox(“Can not open serial port!”);

goto endd;

}

memset(&m_OverlappedRead, 0, sizeof (OVERLAPPED));

memset(&m_OverlappedWrite, 0, sizeof (OVERLAPPED));

COMMTIMEOUTS CommTimeOuts;

CommTimeOuts. ReadIntervalTimeout=0×FFFFFFFF;

CommTimeOuts. ReadTotalTimeoutMultiplier = 0;

CommTimeOuts. ReadTotalTimeoutConstant= 0;

CommTimeOuts. WriteTotalTimeoutMultiplier = 0;

CommTimeOuts. WriteTotalTimeoutConstant = 5000;

SetCommTimeouts(m_hIDComDev, &CommTimeOuts);

Wsprintf(szComparams, “COM2:9600, n, 8, 1”);

m_OverlappedRead. hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

m_OverlappedWrite. hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

dcb. DCBlength = sizeof(DCB);

GetCommState(m_hIDComDev, &dcb);

dcb. BaudRate = 9600;

dcb. ByteSize= 8;

unsigned char ucSet;

ucSet = (unsigned char) ((FC_RTSCTS&FC_DTRDSR) != 0);

ucSet = (unsigned char) ((FC_RTSCTS&FC_RTSCTS) ! = 0);

ucSet = (unsigned char) ((FC_RTSCTS&FC_XONXOFF) ! = 0);

if (!SetCommState(m_hIDComDev, &dcb)‖

!SetupComm(m_hIDComDev,10000,10000)‖

m_OverlappedRead. hEvent ==NULL‖

m_OverlappedWrite. hEvent ==NULL)

{

DWORD dwError = GetLastError();

if (m_OverlappedRead. hEvent != NULL) CloseHandle(m_OverlappedRead. hEvent);

if (m_OverlappedWrite. hEvent != NULL) CloseHandle(m_OverlappedWrite. hEvent);

CloseHandle(m_hIDComDev);

}

endd:

;

}

//发送数据

void CSerialAPIView::OnSend()

{

char szMessage[20] = “thank you very much”;

DWORD dwBytesWritten;

for (int i=0; i

{

WriteFile(m_hIDComDev, (LPSTR)&szMessage[i], 1, &dwBytesWritten, &m_OverlappedWrite);

if (WaitForSingleObject(m_OverlapperWrite, hEvent, 1000))dwBytesWritten = 0;

else{

GentOverlappedResult(m_hIDComDev, &m_OverlappedWrite, &dwBytesWritten, FALSE);

m_OverlappedWrite. Offset += dwBytesWritten;

}

dwBytesWritten++;

}

}

1.2 接收例程

DCB ComDcb; //设备控制块

HANDLE hCom; //global handle

hCom = CreateFile (“COM1”,GENERIC_READ| GENERIC_WRITE,0,

NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if (hCom==INVALID_HANDLE_VALUE)

{

AfxMessageBox(“无法打开串行口”);

}

else

{

COMMTIMEOUTS CommTimeOuts ;

SetCommMask(hCom, EV_RXCHAR ) ;

SetupComm(hCom, 4096, 4096 ) ; /*设置收发缓冲区 尺寸为4K */

PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT |

PURGE_TXCLEAR| PURGE_RXCLEAR ) ; //清收发缓冲区

//以下初始化结构变量CommTimeOuts, 设置超时参数 CommTimeOuts.ReadIntervalTimeout = 0×FFFFFFFF ;

CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;

CommTimeOuts.ReadTotalTimeoutConstant = 4000 ;

CommTimeOuts.WriteTotalTimeoutMultiplier = 0;

CommTimeOuts.WriteTotalTimeoutConstant = 4000 ;

SetCommTimeouts(hCom, &CommTimeOuts ); //设置超时参数

ComDcb.DCBlength = sizeof( DCB ) ;

GetCommState( hCom, &ComDcb ) ; //获取当前参数

ComDcb.BaudRate =9600; //波特率

ComDcb.ByteSize = 8; //数据位

ComDcb.Parity = 0; /*校验 0~4=no, odd, even, mark, space */

SetCommState(hCom, &ComDcb ) ;

} //设置新的通信参数

接收可用定时器或线程等

DWORD dRead,dReadNum;

unsigned char buff [200];

dRead=ReadFile(hCom, buff, 100, &dReadNum, NULL); //接收100个字符,

//dReadNum为实际接收字节数

2 利用端口函数直接操作

这种方式主要是采用两个端口函数_inp(), _outp()实现对串口的读写,其中读端口函数的原型为:

int _inp(unsigned shot port)

该函数从端口读取一个字节,端口号为0~65535。

写端口的函数原型为:

int _outp(unsigned shot port, int databyte)

该函数向指定端口写入一个字节。

不同的计算机串口地址可能不一样,通过向串口的控制及收发寄存器进行读写,可以实现灵活的串口通信功能,由于涉及具体的硬件电路讨论比较复杂,在此不加赘述,

3 MSComm控件

MSComm控件是微软开发的专用通信控件,封装了串口的所有功能,使用很方便,但在实际应用中要小心对其属性进行配置。下面详细说明该类应用方法。

3.1 MSComm控件的属性

CommPort:设置串口号,类型 short :1-comm1 2-comm2.

Settings:设置串口通信参数,类型 CString :B波特率,P奇偶性(N无校验,E偶校验,O奇校验),D字节有效位数,S停止位。

PortOpen:设置或返回串口状态,类型 BOOL:TURE打开,FALSE关闭。

InputMode:设置从接收缓冲区读取数据的格式,类型 long: 0-Text 1-Bin。

Input:从接收缓冲区读取数据,类型 VARIANT。

InBufferCount:接收缓冲区中的字节数,类型:short。

InBufferSize:接收缓冲区的大小,类型:short。

Output:向发送缓冲区写入数据,类型:VARIANT。

OutBufferCount:发送缓冲区中的字节数,类型:short。

OutBufferSize:发送缓冲区的大小,类型:short。

InputLen:设置或返回Input读出的字节数,类型:short。

CommEvent:串口事件,类型:short。

3.2 程序示例

串口初始化

if (!m_comm.GetPortOpen())

m_comm.SetPortOpen(TURE); /*打开串口*/

m_comm.SetSettings(“4800,n,8,1”); /*串口参数设置*/

m_comm.SetInputMode(0); /*设置TEXT缓冲区输入方式*/

m_comm.SetRthresHold(1); /*每接收一个字符则激发OnComm()事件*/

接收数据

m_comm.SetInputLen(1); /*每次读取一个字符

VARINAT V1=m_comm.GetInput();

/*读入字符*/

m_V1=V1.bstrval;

发送字符 m_comm.SetOutput(Colevariant (“Hello”); /*发送 “Hello” */

3.3 注意

SetOutput方法可以传输文本数据或二进制数据。用SetOutput方法传输文本数据,必须定义一个包含一个字符串的 Variant。发送二进制数据,必须传递一个包含字节数组的Variant 到 Output 属性。正常情况下,如果发送一个 ANSI 字符串到应用程序,可以以文本数据的形式发送。如果发送包含嵌入控制字符、Null 字符等的数据,要以二进制形式发送。此处望引起读者注意,笔者曾经在此犯错。

4 VC++类CSerial

4.1 串行通信类CSerial简介

Cserial 是由MuMega Technologies公司提供的一个免费的VC++类,可方便地实现串行通信。以下为该类定义的说明部分。

class CSerial

{

public:

CSerial();

~CSerial();

BOOL Open( int nPort = 2, int nBaud = 9600 );

BOOL Close( void );

int ReadData( void *, int );

int SendData( const char *, int );

int ReadDataWaiting( void );

BOOL IsOpened( void ){ return( m_bOpened ); }

protected:

BOOL WriteCommByte( unsigned char );

HANDLE m_hIDComDev;

OVERLAPPED m_OverlappedRead, m_OverlappedWrite;

BOOL m_bOpened;

}

4.2 串行通信类Cserial 成员函数简介

1. CSerial::Cserial是类构造函数,不带参数,负责初始化所有类成员变量。

2. CSerial:: Open这个成员函数打开通信端口。带两个参数,第一个是埠号,有效值是1到4,第二个参数是波特率,返回一个布尔量。

3. CSerial:: Close函数关闭通信端口。类析构函数调用这个函数,所以可不用显式调用这个函数。

4. CSerial:: SendData函数把数据从一个缓冲区写到串行端口。它所带的第一个参数是缓冲区指针,其中包含要被发送的资料;这个函数返回已写到端口的实际字节数。

5. CSerial:: ReadDataWaiting函数返回等待在通信端口缓冲区中的数据,不带参数。

6. CSerial:: ReadData函数从端口接收缓冲区读入数据。第一个参数是void*缓冲区指针,资料将被放入该缓冲区;第二个参数是个整数值,给出缓冲区的大小。

4.3 应用VC类的一个实例

1. 固定式EBM气溶胶灭火系统简介

固定式EBM气溶胶灭火装置分区启动器是专为EBM灭火装置设计的自动控制设备。可与两线制感温、感烟探测器配套使用,当监测部位发生火情时,探测器发出电信号给分区启动器,经逻辑判断后发出声、光报警,延时后自动启动EBM灭火装置。为了便于火灾事故的事后分析,需对重要的火警事件和关键性操作进行记录,记录应能从PC机读出来;PC机能控制、协调整个系统的工作,这些都涉及通信。本例中启动器采用RS-485通信接口,系统为主从式网络,PC机为上位机。具体的通信协议为:(1)下位机定时向上传送记录的事件;(2)应答发送,即PC机要得到最新事件记录,而传送时间未到时,PC机发送命令,下位机接收命令后,把最新记录传给上位机;(3)上位机发送其它命令如校时、启动、停止、手/自动等。

2. 通信程序设计

部分上位机程序

(1)发送命令字程序,代码如下

voidCCommDlg::OnSend()

{

CSerial Serial;

//构造串口类,初始化串行口

if (Serial.Open(2,9600)) //if-1

//打开串行口2,波特率为9600bps

{

static char szMessage[]=“0”;

//命令码(可定义各种命令码)

int nBytesSent;

int count=0;

resend:

nBytesSent=Serial.SendData(szMessage,strlen(szMessage));

//发送命令码

char rdMessage [20];

if (Serial.ReadDataWaiting()) //if-2

{

Serial.ReadData(rdMessage,88);

//rdMessage 定义接收字节存储区,为全局变量//

if ((rdMessage[0]!=0x7f)&&(count<3))

{

count++;

goto resend

}

if(count>=3)

MessageBox(“发送命令字失败”);

}

else //if-2

MessageBox(“接收数据错误”);

}

else //if-1

MessageBox(“串行口打开失败”);

}

下位机通信程序:

#include

#include

#include

#define count 9

#define com_code 0x00

#define com_code1 0xff

unsigned char buffer[count];

int po,year,month,date,hour;

int minute,second,recordID ;

int sum;

main()

{

/*初始化串口和定时器*/

TMOD=0×20;

TH1=0×fd;

TR1=0×01;

ET1=0×00;

ES=1;

EA=1;

/*待发送数据送缓冲区*/

buffer[0]=0×ff; //数据特征码

buffer[1]=count+1; //数据长度

buffer[2]=year; //年

buffer[3]=month; //月

buffer[4]=date; //日

buffer[5]=hour; //时

buffer[6]=minute; //分

buffer[7]=second; //秒

buffer[8]=recordID; //事件号

for(po=0;po

sum+=buffer[po];

buffer[9]=sum; //校验和

}

/*发送中断服务程序*/

void send(void) interrupt 4 using 1

{

int i;

RI=0;

EA=0;

do

{

for(i=0;i<=count;i++)

{

SBUF=buffer[i]; //发送数据和校验和//

while(TI==0);

TI=0;

}

while(RI==0);

RI=0;

}while(SBUF!=0); //主机接收不正确,重新发送//

EA=1;

Return;

}

5 应用总结

根据不同需要,选择合适的方法。我们选用的用VC++类实现的上位机和下位机的串行通信方法具有使用简单、编写程序方便的特点。经过半年多应用于EBM灭火系统的情况来看,该方法实现的系统运行稳定可靠,是一种值得推广的简单易行的通信方法。

参 考 文 献

1 Kate Gregory Visual C++6开发使用手册.北京:机械工业出版社,1999

2 何立民.单片机的C语言应用程序设计.北京:北京航空航天大学出版社,1997

3 马风格.VC控件与串行通讯.1999现代计算机,2000(4)

利用VC实现网络通信 篇3

关键词:VC++;串口通信;设计方案

To Achieve Design Method of Serial Communication on VC+ +

Xiao Zhihao

(No.715 Institute,Fuyang311400,China)

Abstract: With the computer technology and control technology and the rapid development of increasingly mature,play all kinds of communication between the role of functional modules based on VC + + computer programming serial communications in today's computer software is widely used.In this paper,fully mechanized work system for example,an overview of VC + + based on the host computer and lower computer serial communication between the design method.

Keywords:VC + +;Serial communication;Design

综采工作面电控系统是综合机械化采煤装备,它利用液压支架和采煤机、输送机等多机联动,具有高产、高校、安全、自动化等优点。

一、综述

综采工作面液压支架电控系统硬件如图一所示。下位机的功能是完成液压支架的控制,上位机的功能是完成子控机的监测控制。基于VC++的综采工作面液压直接电控系统实现上位机和下位机之间的串口通信,实现人机界面的动态显示,数据库读写等功能。

图一

二、串行函数接口程序设计

在此系统中,上位机和下位机之间的串口通信可以采用方法很多,例如VB、Matlab、组态王、VC++等等,但是在这几种软件中,VB的编程工具不够完全,效率低;组态王命令语言环境弱,传输大量数据时局限性很大,难以实现复杂的数据处理;Matlab的界面开发能力不强,代码运行效率低。因此,效率高、封装性好、继承性高的VC++软件成为开发本系统的首选串口编程软件。

(一)上位机通信设计。首先要对串口进行初始化,确定其工作方式、波特率等,系统定为:1个停止位、波特率9600,数据格式为8个数据位等。具体实现:

1.设置对话框初始化CAN参数:为对话框建立基于CDialog的派生类CC ansettingDlg,并利用Class-Wizard”菜单项以及Member Variables为参数控件设置关联变量。同时,添加按钮并添加响应函数,点击链接时,各项的初始化参数都自动存储,并且与CAN总线连接,一旦点击启动按钮,就能够存储总线信号。

2.基于VC++采用MFC编写接口函数,过程如下:(1)打开设备并初始化CAN:CCansettingDlg::CCansettingDlg(CWnd* pParent /* = NULL……:CDialog(CCansettingDlg::IDD,pParent);(2)获取CAN 状态:typedef struct _VCI_CAN_STATUS;(3)连接CAN:void CCansettingDlg::OnButtonConnect() / /为连接按钮添加;(4)启动CAN:void CCansettingDlg::OnButtonStartcan();(5)从指定的设备接收数据并放入数据库。

3.创建线程,从CAN总线读取的数据存入数据库:static UINT ReceiveThread( void * param);//创建线程,添加响应函数,设置变量,总线上有数据,就能够触发线程,把数据存入数据库,其函数为:

(二)下位机通信设计。下位机采用的是MCS—51系列中的8051单机。下位机的串行通信设计时采用中断收发数据的,其流程如下图。发送数据时,从累加器中向串口缓冲寄存器中传送数据;接受数据时,从串口缓冲寄存器向累加器传送数据。实际应用中,单片机接受PC机发出的地址信号之后,转入相应的中断程序服务子程序,与PC机通信。

下位机流程图

三、程序串口测试

通过简单串口调试工具,进行程序测试,如下图:

测试显示

如果串口正常运行, 那么可以自由接收和发送数据。

总结:综合上述例子,VC++相对与其他编程软件来说,是一个非常优秀的系统开发平台,编程简化、程序透明化、适应性好、可移植性高。利用VC++运行库的通信函数实现串口通信的原理简单,但是依旧有着不足之处,其实用性和灵活性较差,因此,在具体实践时,要结合软件的功能模块需求,综合考虑其复杂程度、灵活性等环境因素,选择适当的方式,来实现上位机与下位机之间的串口通信。

参考文献:

[1]赵晓辉,陈艳萍,张科英,张东红.基于VC++环境下串口通信程序的研究与实现[J].科技信息,2010,1

[2]王娇,姚竹亭.基于VC++6.0的串口通信的设计[J].测试工具及解决方案,2009,11

[3]白宁,金华晋.基于VC++6.0的串口通信程序开发[J].电脑编程技巧与维护,2010,12

点对点通信机制的VC实现方法探讨 篇4

点对点 (P2P) 技术目前已经成为计算机通信技术、网络通信技术的研究热点, 国内外很多学者对P2P技术进行了研究。利用P2P技术实现PC机之间、PC机与服务器之间的通信已经比较成熟了, 这从目前网络上广泛流行和使用的各类P2P聊天软件、下载软件就可以反映出来。当前, 对于P2P技术的研究热点, 在于利用P2P技术组建P2P网络系统, 实现网络视频点对点的组播技术, 真正实现网络传输的数字化。

本论文结合中职院校的VC教学, 对采用VC实现的点对点通信原理加以分析探讨, 并试图给出VC实现方法代码, 以期获得对P2P技术的更好理解, 并和同行分享。

2. 点对点通信技术概述

2.1 什么是点对点通信

点对点传输技术 (Peer-to-Peer, 简称P2P) 又称对等互联网络技术, 是一种网络新技术, 依赖网络中参与者的计算能力和带宽, 而不是把依赖都聚集在较少的几台服务器上。点对点网络通常用于通过Ad Hoc连接来连接节点。这类网络可以用于多种用途, 各种档案分享软件已经得到了广泛的使用。点对点技术也被使用在类似VoIP等实时媒体业务的数据通信中。

2.2 常见的点对点传输方法比较分析

对于实现点对点通信的方法大致可以分为3类:一是使用高级语言基于Socket套接字编程;二是基于MPI (消息传递接口) 通信编程;三是基于中间件的通信编程。在网络通信中, 通信双方可能是同构的, 也可能是异构的。通信软件基于的操作系统可能是相同的, 也可能是不同的。因此, 在实现点对点通信中, 也要解决异构环境下的编程问题。

数据传输的可靠性是通过数据链路层和网络层的点对点和传输层的端对端保证的。点对点是基于MAC地址或者IP地址, 是指一个设备发数据给另外一个设备, 这些设备是指直连设备包括网卡, 路由器, 交换机。端对端是网络连接, 应用程序之间的远程通信。端对端不需要知道底层是如何传输的, 是一条逻辑链路。端到端与点到点是针对网络中传输的两端设备间的关系而言的。端到端传输指的是在数据传输前, 经过各种各样的交换设备, 在两端设备问建立一条链路, 就像它们是直接相连的一样, 链路建立后, 发送端就可以发送数据, 直至数据发送完毕, 接收端确认接收成功。点到点系统指的是发送端把数据传给与它直接相连的设备, 这台设备在合适的时候又把数据传给与之直接相连的下一台设备, 通过一台一台直接相连的设备, 把数据传到接收端。端到端传输的优点是链路建立后, 发送端知道接收设备一定能收到, 而且经过中间交换设备时不需要进行存储转发, 因此传输延迟小。端到端传输的缺点是直到接收端收到数据为止, 发送端的设备一直要参与传输。如果整个传输的延迟很长, 那么对发送端的设备造成很大的浪费。

笔者认为使用基于Socket套接字编程方式是解决异构环境下通信问题的最佳方式, 它成本低, 不需要额外的系统支持, 适合于各种操作系统。同时对传统的套接字通信方法进行改进, 使用多线程并发程序设计方法, 让每一个数据通信事务构成一个线程, 并使其并发执行, 以达到提高传输速度和吞吐量。

3. 点对点通信的VC实现探讨

(1) 通信过程的实现

本论文采用面向连接的流式套接字, 基于客户/服务器模型。为了使用方便, 将客户和服务器设计在同一个用户界面中, 根据用户需要将程序设置成客户端或者服务器端。程序工作时, 首先由程序建立套接字连接, 在连接的基础上, 由重载的Socket事件通知函数启动相应的任务。为了提高程序的反应速度, 程序的文件上传和文件下载任务由辅助线程启动。

(1) 点对点文件传输工程的建立。

利用Visual C++6.0的Appwizard创建MFC EXE项目, 把工程命名为“File Transfer”, 在Appwizard的第四步, 选中“Windows Sockets”选项, 以使所创建的工程支持Socket, 并进行初始化。如果要在已有的项目中添加Socket支持, 必须在stdafx1h文件中包含头文件winsock1h, 即加入包含语句:#include“winsocket”, 并在应用程序类的成员函数:Init Instance () 中添加初始化套接字代码, 具体代码如下:

(2) Socket类的设计。

我们采用MFC中提供的CSocket为基类, 采用流式套接字方式即面向连接的协议TCP开发Socket网络通信程序。作为服务器端需要用一个Socket来监听连接。当然不希望这个Socket是阻塞式的调用, 所以我们从CSocket继承了一个CListenSocket, 它响应OnAccept和On Close, 而这些消息的具体处理是在CFile Transfer Dlg类中完成的。

SOCKET通信是目前常用的通信方式之一。文中以8位单片机AT89C52作为微控制器, 它利用自带的异步串口与电平转换芯片MAX232和GPRS模块连接, 使用AT命令对GPRS模块LT8030进行控制, 从而实现SOCKET通信。详细介绍SOCKET通信中要用到的AT命令, 并给出实现SOCKET通信的完整程序。在CClientSocket的设计中, 我们主要使用了如下的成员函数和成员变量:

在上述成员函数和成员变量中, m_pFile用于文件传输或文件接收, 两个CArchive型的变量主要是用于在两个应用程序中传输控制命令及其他信息而使用的, SendMsg和RevceiveMsg分别用来发送和接收通信信息。

(3) Message类的设计。

为了在应用程序间传输相应的控制命令, 我们设计了Message类。在Message类中我们设计了三个public成员变量:m_nType、m_str File Name和m_dwFileSize, 分别表示文件的传输方式 (是发送还是接收) 、文件名称和文件大小, 然后通过Serialize (CArchive&ar) 函数将这三个变量以流的形式进行传输。

(4) 连接应用程序。

当应用程序开始连接时, 可调用Create函数, 其Socket变量依据应用程序运行在客户机上还是服务器上而定。最后, 调用Connect或Listen函数初始化应用程序端的连接。

(5) 接收文件和发送文件线程的创建。

(6) 接收文件功能的实现。

(7) 发送文件功能的实现。

(2) 部分源代码

//当程序作为服务器

4. 结语

采用面向连接的流式套接字所设计的点对点通信, 具有较好的通信可靠性和实时性, 本论文采用VC语言实现了该点对点通信机制, 对于基于Socket套接字编程方式实现点对点通信机制, 是一次很好的尝试, 在理论研究和实践上均具有值得借鉴的地方。

参考文献

[1]尹浩琼, 李剑.TCP/IP详解 (第二版) [M].北京:电子工业出版社, 2003.

[2]张维承, 王勇, 陈抗生.原始套接字编程在嵌入式Internet通信协议中的应用[J].计算机应用研究, 2002, (10) :37-38.

利用VC实现网络通信 篇5

1 Virtools工作环境

Virtools是由一系列预先已设定好的组件构成组件数据库。其中,每种组件都具有一个相应的Setup面板供用户做进一步的设定动作。Virtools里的每个组件都可以被指定独立的行为交互模块与属性。

对于3D Entities组件,每一个Virtools里的3D组件都以一个数学数组的形式存储其在三维空间坐标里的位置、方向和大小等资料。3D Objects、Cameras、Lights等等都属于3D组件。

2 网络化系统功能及流程

所涉及的网络监控是指由一台监控机通过网络观察另外一台或两台操作机实时操作情况的情况。操作机可以将本地操作环境和操作动作实时地传送到监控机,监控机可以根据操作机数量的多少为每个操作机分配相应的窗口,使监控机可以看到操作机的操作情况,从而实现网络监控,其实现的过程如图1所示。

3 关键技术

3.1 Virtools与VC++6.0通信接口设置

为了进行实现监控功能,VC++需要知道操作零件的名称、零部件的坐标值和方向值,然后传递给监控机,针对同一零件进行同样的操作。而Virtools中包含相应的信息,这就需要Virtools留出通信接口,以方便VC++读取相关信息。

Virtools中的阵列用于建立数据、时间变量控制等等,它由Column(列)和Row(行)组成,在程序中可以通过Set Cell行为交互模块对阵列的每一个元素及相应参数进行设置,通过Test和2D Picking行为交互模块判断此时被用户操作的零部件,再用Set Cell模块把操作零部件的名称写到规定的阵列中[1]。在VC++中,利用Virtools SDK中相应的读取函数来读取阵列中不同属性的对象。将阵列命名为“out”,由于在场景中应能随时切换摄像机,这里将第一列设定为摄像机;第二列设定为3D物体,表示用户同一时刻操作或点选的物体;第三列设定为String型变量number,用于判断监控机是否已经装载相应场景。其具体设置如图2和图3所示。

3.2 数据的读取

数据的读取包括对文件和操作部件名称的读取以及对操作部件坐标和方向的读取。读取文件名称的语句如下:

其中,Get Module File Name(NULL,sz Path,_MAX_PATH)将文件全路径放在sz Path中,_splitpath(sz Path,drive,dir,filename,ext)将路径分离为四个部分,filename是没有扩展名的文件名,ext是文件的扩展名,于是得到了文件的名称[2]。

读取操作部件的名称及坐标方位信息的主要实现语句如下:

同理可获得物体的坐标值及方向值。

3.3 监控的实现

要实现监控,必须首先实现数据的实时发送和接收,本文即是数据结构体的传输。在两端用Create()函数为套接字对象创建Windows套接字,调用Bind()函数将此套接字绑定到指定的地址,初始化设置如下[4]:

首先判断是否第一次接收本文件,若标志位飞flag=0,则是,此时利用Load()函数加载文件,改变标志位,并将标志位传递给发送端;若flag=1,则不是第一次传送,则不需要加载。

装载文件之后,对被操作零部件坐标值和方向值进行解析,将其各个参数值赋予监控机的同一零部件,进而使监控机零部件产生同被监控机一样的改变,进而实现监控,其主要实现语句如下:

同理,可获取物体的相关信息并赋予监控机的同一零部件,使其进行相应的动作。

4监控界面

如图4、图5所示。

5结语

利用强大交互功能的VC++软件对Virtools进行二次开发,实现了虚拟维修的网络化监控,对于教员实时地观察和指导有着非常重要的意义。

摘要:利用VC++6.0对Virtools进行二次开发,实现了网络监控功能,即一台监控机通过网络对另一台或两台操作机操作过程进行实时监控。采用阵列作为两款软件通信的接口,Virtools将每个文件的名称、零件的名称、零件的位置和方位等参数写到阵列中;在VC++6.0中,利用相应的SDK函数进行读取阵列中的参数,通过Windows Socket将相应文件和零件的参数传递到监控机,在监控机上通过界面编程实现网络监控。

关键词:网络监控,阵列,二次开发,界面编程

参考文献

[1]王丹东,徐英新,胥林.三维游戏设计师宝典—Virtools行为模块词典大全[M].电脑报电子音像出版社,2009.

[2]罗虹,王士勇.基于Virtools技术的虚拟教学系统的设计与实现[M].现代教育技术,2007,10.

[3]罗斌,等.Visual C++编程技术精选500例[M].中国水利水电出版社,2005.

利用VC实现网络通信 篇6

目前较为常用的串口有9针串口 (DB9) 和25针串口 (DB25) 。最为简便且常用的是三线制, RS-232相连。RS-232-C串口通信接线方法列举如下:

9针——9针:2——3 3——2 5——5;25针——25针:3——2 2——3 7——7;9针——25针:2——2 3——3 5——7。

单片机与微机的通信模型如图1。

单片机处理程序的原理框图如图2。

单片机的UART0是一个异步、全双工串口。如果UART0中断被允许, 则每次发送完成 (SCON0中的TI0位被置‘1’) 或接收到数据字节 (SCON0中的RI0位被置‘1’) 时将产生一个中断。当CPU转向中断服务程序时硬件不清除UART0中断标志。中断标志必须用软件清除, 这就允许软件查询UART0中断的原因 (发送完成或接收完成) 。UART0波特率由定时器1工作在8位自动重装载方式产生。UART0波特率由定时器1工作在8位自动重装载方式产生。定时器1的重载值应设置为使其溢出频率为所期望的波特率频率的两倍。注意, 定时器1的时钟可以在6个时钟源中选择:SYSCLK、SYSCLK/4、SYSCLK/12、SYSCLK/48、外部振荡器时钟/8和外部输入T1。在8位UART方式, 每个数据字节共使用10位:1个起始位、8个数据位 (LSB在先) 和1个停止位。数据从TX0引脚发送, 在RX0引脚接收, 在接收时8个数据位存入SBUF0。

单片机的编写, 首先是初始化很多寄存器, 在这里主要是用到了串口通信的UART0模块, 根据前面的介绍, 要设定UART0和TIMER1的一些寄存器的值, 并对振荡器进行设定。先控制交叉开关, 将P0.4和P0.5映射给串口的输入输出, 将P0.4位, 即串口输出位设定为推挽输出模式, 打开交叉开关。设定对于锁相环的各个控制端口的初始要求电平, 设定串口的中断优先级为高。

接下来设定UART0的工作模式, 主要是将其设为8位传输模式, 波特率为9 600, 可将SCA1-SCA0设定为‘00’, 将系统时钟的1/12设为定时器的时钟输入, T1M设为‘1’, 定时器1工作在模式3, 定时器1的高8位 (TH1) 和低8位 (TL1) 都设定成‘0x96’, 分别是重载值和计数值。再将定时器启动, 设置TR1位为‘1’。最后允许中断, 包括所有中断和串口中断。这样UART0的设定就完成了, 就可以使用串口通信了。

具体初始化程序:

对于微机处理程序, 如图3所示。

在PC软件编写方面, 使用VC提供的对话框模板, 串口通信使用Microsoft提供的MSComm (Microsoft Communications Control) 控件。它提供了两种处理通信问题的方法:一是事件驱动 (Event-driven) 方法, 一是查询法。此次使用的事件驱动方法。

事件驱动是处理串口通信的一种非常有效的方法。在事件发生时需要得到通知, 例如, 在串口接受缓冲区中有字符, 或者Carrier Detect (CD) 或Request To Send (RTS) 线上一个字符到达或一个事件发生时。在这些情况下, 可以利用MSComm控件的On Comm事件捕获并处理这些通信事件, 另外, On Comm事件还可以检查和处理通信错误。

这个控件的使用可以在VC中和其他控件一样简单地使用, 电话样的按钮就是MSComm控件, 双击后可以出现一个方法, 就是控件发生事件后的处理。串口缓冲区里的数据被包装成VARI-ANT类, 需要将他它赋值给CArray类的对象, 将其转化为一个不定长度的字节数组, 再读取其中数据, 而后进行处理。以下是串口产生事件后的处理程序:

综上所述, 通过这样的编写程序, 就可以实现PC机与单片机的串口通信。

摘要:串行通信接口标准经过使用和发展, 目前已有多种。但都是在RS-232标准的基础上经过改进形成的。该文介绍了如何用串行接口联接单片机与PC机, 分为3部分, 第一部分简单介绍了串行接口, 第二部分介绍了单片机程序的编写, 第三部分介绍了PC机上程序的编写。

关键词:VC++,PC机,单片机,串行接口

参考文献

[1]陈冬梅, 梁红玉, 陆冬妹.PC机与单片机间串行通信的实现[J].现代电子技术, 2010 (17) :196-198.

[2]吴来杰, 文清华, 江进国, 等.在VC++6.0中用内嵌汇编语言实现PC机与单片机的串行通信[J].电气自动化, 2003 (4) :74-76.

利用VC实现网络通信 篇7

关键词:VC开发,客户端/服务器模式,Socket技术,网络考试系统

1 引言

互联网技术的广泛应用与快速发展,已经成为人们日常生活中必不可少的工具。在各行各业,计算机网络都产生着深远的影响,尤其在教育行业,计算机网络正给教育界带来了一场新的革命,改变着原有的教育模式。

计算机通信网络技术为纸质考试向计算机网络考试方式转变提供了可能。计算机网络考试就是利用计算机技术和网络技术,将传统纸质的考试题目使用计算机从已有试题库中生成考试题,试题库经过加密处理并安装到考试服务器中。考生考试时启动考试客户端随机抽题并完成答题操作。考试完成后,考生提交考试试卷,系统进行智能评卷,计算机显示考试成绩,系统同时将考试过程操作文档及数据保存到考试服务器中。可见,使用计算机网络考试系统与传统的纸质考试相比,在公平性、可操作性、安全性、经济性等方面均具有较大的优势。

基于C/S结构设计实现了一个网络考试系统,研究了网络考试系统的架构和设计思路,对用到的网络技术进行了分析。

2 整体架构

网上考试系统的网络架构一般有浏览器/服务器(B/S)模式和客户端/服务器(C/S)模式。

B/S(Browser/Server)模式即浏览器和服务器模式。在这种模式下,程序界面是通过浏览器来展现给用户的,而主要的功能在服务器端(Server)实现,形成所谓三层3-tier结构。这样大大减轻了客户端的负荷,降低了系统维护与升级的成本,降低了用户的总体成本(TCO)。

C/S(Client/Server)模式即客户机和服务器模式。通过这种模式可以充分利用两端软硬件环境资源,将任务合理分配到客户端和服务器端来实现,可以降低服务器的负荷。

结合本考试系统的特点和要求,按照系统的设计目标,采用了客户端/服务器(C/S)模式进行系统整体架构的设计。如图1是系统架构图。

如图1所示,管理客户端和考生客户端都通过TCP Socke与服务器取得连接,当连接建立之后,就可以在客户端和服务器端传输数据。在本系统中,客户端会发送请求命令给考试服务器,考试服务器程序根据客户端的请求,查询数据库中的数据,生成应答数据包发送回客户端,客户端再将得到的结果显示在界面上。

3 执行流程

系统的运行要首先启动服务器端,服务器端负责接收客户端的连接,并执行客户端发来的数据请求,将得到的结果返回给客户端。客户端启动后,首先会出现登录界面,登录成功后会转到功能界面,让用户选择需要的功能来执行。如图2是系统执行流程。

4 服务器与客户端的通信

客户端与服务器的通信是使用Socket套接字实现的。Socket套接字是在TCP/IP协议之上的一组编程接口,它屏蔽了底层协议的差异和复杂的实现过程,向编程人员提供简单的编程接口,开发者只需调用相关的应用接口,便可实现双方计算机的通信。

考试服务器运行之后,会负责数据库数据的查询和修改,负责接收客户端的请求,并将处理结果返回给相应的客户端。服务器端Socket的建立过程的主要代码如下:

客户端主要负责接收用户输入数据,生成请求数据包,发送给服务器,将服务器返回的结果数据正确地解析出来。以下是客户端连接服务器的主要代码:

5 结语

随着计算机网络技术和互联网的发展与应用,教育行业中网络考试系统的应用越来越多。本系统使用了Socket技术来进行客户端与服务器的数据传输。完成了预期的功能,对网络考试系统的研究和应用有一定的理论指导和实践参考价值。

参考文献

[1]宁洁琪.网络考试系统的设计与实现[J].计算机与信息技术,2009,(8):83-85.

[2]周子立.计算机网络考试系统的二次开发[J].浙江机电职业技术学院学报,2009,(6):52-54.

上一篇:急嫁下一篇:施工吊桥