VC实现串行通讯的三种途径
- 格式:doc
- 大小:531.50 KB
- 文档页数:11
学校logo[请输入论文题目]专业:[请输入专业]班级:[请输入班级]学生姓名:[请输入姓名]指导教师:[请输入指导教师]完成时间:2013年3月29日用VC 6.0实现串行通信的三种方法---- 摘要:本文介绍了在Windows平台下串行通信的实现机制,讨论了根据不同的条件用Visual C++ 设计串行通信程序的三种方法,并结合实际,实现对温度数据的接收监控。
---- 在实验室和工业应用中,串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。
依据不同的条件实现对串口的灵活编程控制是我们所需要的。
---- 在光学镜片镀膜工艺中,用单片机进行多路温度数据采集控制,采集结果以串行方式进入主机,每隔10S向主机发送一次采样数据,主机向单片机发送相关的控制命令,实现串行数据接收,处理,记录,显示,实时绘制曲线。
串行通信程序开发环境为VC++ 6.0。
---- Windows下串行通信---- 与以往DOS下串行通信程序不同的是,Windows不提倡应用程序直接控制硬件,而是通过Windows操作系统提供的设备驱动程序来进行数据传递。
串行口在Win 32中是作为文件来进行处理的,而不是直接对端口进行操作,对于串行通信,Win 32 提供了相应的文件I/O函数与通信函数,通过了解这些函数的使用,可以编制出符合不同需要的通信程序。
与通信设备相关的结构有COMMCONFIG ,COMMPROP,COMMTIMEOUTS,COMSTA T,DCB,MODEMDEVCAPS,MODEMSETTINGS共7个,与通信有关的Windows API函数共有26个,详细说明可参考MSDN帮助文件。
以下将结合实例,给出实现串行通信的三种方法。
---- 实现串行通信的三种方法---- 方法一:使用VC++提供的串行通信控件MSComm 首先,在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project --> Add to Project --> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。
用c语言实现串口读写程序一、前言串口通信是一种常见的通信方式,它可以实现单片机与计算机之间的数据传输。
在嵌入式系统中,使用串口通信可以方便地进行调试和数据传输。
本文将介绍如何使用C语言实现串口读写程序。
二、硬件准备在进行串口通信之前,需要准备好相应的硬件设备。
一般来说,需要一台计算机和一个串口转USB模块(或者直接使用带有串口接口的计算机)。
同时,在单片机端也需要连接一个串口模块。
三、C语言编程实现1. 打开串口在C语言中,可以通过打开文件的方式来打开串口设备。
下面是一个示例代码:```#include <stdio.h>#include <fcntl.h>#include <termios.h>int open_serial_port(const char *device_path, int baud_rate) {int fd;struct termios options;fd = open(device_path, O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) {perror("open_serial_port: Unable to open device");return -1;}fcntl(fd, F_SETFL, 0);tcgetattr(fd, &options);cfsetispeed(&options, baud_rate);cfsetospeed(&options, baud_rate);options.c_cflag |= (CLOCAL | CREAD);options.c_cflag &= ~PARENB;options.c_cflag &= ~CSTOPB;options.c_cflag &= ~CSIZE;options.c_cflag |= CS8;options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);options.c_oflag &= ~OPOST;tcsetattr(fd, TCSANOW, &options);return fd;}```在上述代码中,open_serial_port函数用来打开串口设备,并设置相应的参数。
C语言实现串口通信在使用系统调用函数进行串口通信之前,需要打开串口设备并设置相关参数。
打开串口设备可以使用open(函数,设置串口参数可以使用termios结构体和tcsetattr(函数。
以下是一个简单的串口通信接收数据的示例代码:```c#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h>#include <termios.h>int mainint fd; // 串口设备文件描述符char buff[255]; // 存储接收到的数据int len; // 接收到的数据长度//打开串口设备fd = open("/dev/ttyS0", O_RDONLY);if (fd < 0)perror("Failed to open serial port");return -1;}//设置串口参数struct termios options;tcgetattr(fd, &options);cfsetspeed(&options, B1200); // 设置波特率为1200 tcsetattr(fd, TCSANOW, &options);//接收数据while (1)len = read(fd, buff, sizeof(buff)); // 从串口读取数据if (len > 0)buff[len] = '\0'; // 将接收到的数据转为字符串printf("Received data: %s\n", buff);}}//关闭串口设备close(fd);return 0;```这段代码首先通过open(函数打开串口设备文件"/dev/ttyS0",然后使用tcgetattr(函数获取当前设置的串口参数,接着使用cfsetspeed(函数设置波特率为1200,最后使用tcsetattr(函数将设置好的串口参数写回。
在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。
串口通信方便易行,应用广泛。
一般情况下,工控机和各智能仪表通过RS485总线进行通信。
RS485的通信方式是半双工的,只能由作为主节点的工控PC机依次轮询网络上的各智能控制单元子节点。
每次通信都是由PC机通过串口向智能控制单元发布命令,智能控制单元在接收到正确的命令后作出应答。
在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活。
其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。
本文我们只介绍API串口通信部分。
串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。
同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。
无论那种操作方式,一般都通过四个步骤来完成:(1)打开串口(2)配置串口(3)读写串口(4)关闭串口(1)打开串口Win32系统把文件的概念进行了扩展。
无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。
该函数的原型为:HANDLE CreateFile( LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDistribution,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile);•lpFileName:将要打开的串口逻辑名,如“COM1”;•dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列;•dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0;•lpSecurityAttributes:引用安全性属性结构,缺省值为NULL;•dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING;•dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操作;•hTemplateFile:对串口而言该参数必须置为NULL;同步I/O方式打开串口的示例代码:HANDLE hCom; //全局变量,串口句柄hCom=CreateFile("COM1",//COM1口GENERIC_READ|GENERIC_WRITE, //允许读和写0, //独占方式NULL,OPEN_EXISTING, //打开而不是创建0, //同步方式NULL);if(hCom==(HANDLE)-1){AfxMessageBox("打开COM失败!");return FALSE;}return TRUE;重叠I/O打开串口的示例代码:HANDLE hCom; //全局变量,串口句柄hCom =CreateFile("COM1", //COM1口GENERIC_READ|GENERIC_WRITE, //允许读和写0, //独占方式NULL,OPEN_EXISTING, //打开而不是创建FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //重叠方式NULL);if(hCom ==INVALID_HANDLE_VALUE){AfxMessageBox("打开COM失败!");return FALSE;}return TRUE;(2)、配置串口在打开通讯设备句柄后,常常需要对串口进行一些初始化配置工作。
基于VC++6.0实现的串口通讯摘要:串口通讯作为一种灵活、方便、可靠的通讯方式,广泛应用于计算机与其它设备之间的通讯以及工业控制系统中,是计算机与外部设备进行数据通讯时经常使用的方式之一。
本文介绍了VC++6.0环境下利用MSComm控件实现计算机与外部设备之间的串口通讯。
关键词:串口通讯VC++6.0MSComm一、引言串口作为计算机标准配置中的对外接口,由于其简便、易行及数据传输可靠等优点,使其成为计算机与外部设备之间通讯的主要手段之一,广泛应用于工业控制系统中。
VC++6.0作为面向对象的可视化开发工具,具有良好的界面设计能力,利用具有良好运行效率和稳定性的MSComm控件,可以简单方便的实现串口通讯功能。
二、MSComm控件介绍VC++6.0是基于Windows操作系统的主流编程可视化语言。
应用VC++6.0开发串行通讯通常有如下几种方法:1.利用Windows API通讯函数。
2.利用VC的标准通讯函数_inp,_inpw,_inpd,_outp,_outpw,_outpd等直接对串口进行操作。
3.使用Microsoft Visual C++的通讯控件(MSComm)。
以上几种方法中,前两种由于使用时需要的专业程度比较高,需要了解内部接口及标准通讯函数的定义,因此比较困难;第三种方法较简单,对使用者要求不高,只需对串口进行简单配置即可。
Microsoft Communications Control(以下简称MSComm)是Microsoft公司基于组件对象模型(COM)开发的简化Windows下串口通讯编程的ActiveX控件,它为应用程序提供了通过串口接口收发数据的简便方法。
该控件屏蔽了通讯过程中的底层操作,用户只需通过设置并监视其属性和事件,即可完成串口编程,实现与被控制对象的串行通讯、数据交换,并监视或响应在通讯过程中可能发生的各种错误和事件。
具体有两种处理方法:一是事件驱动(Event-Driven)。
串口基本信息用一台电脑实验串口自发自收,实验前要将串口(以9针为例)的发送引脚(2脚)和接受引脚(3脚)短接。
三线连接:适用于计算机之间尤其是PC机和单片机之间的数据通信。
其连接信号对为(TxD,RxD)、(RxD,TxD)、(SG,SG)。
即发送数据TxD端和接受数据RxD端交叉连接,信号地SG对应连接。
七线交叉连接:适用于同型号的计算机之间的连接,如PC机间的数据通信。
其连接信号对为:(TxD,RxD)、(RxD,TxD)、(SG,SG)、(RTS,CTS)、(CTS,RTS)、(DSR.DTR)、(DTR,DSR)。
其中,TxD、RxD、SG与前面信号的含义相同,RTS为请求发送,CTS为准许发送,DSR为数据装置准备好,DTR为数据终端准备好。
在本地连接的微机系统中,RTS、CTS、DTR、DSR用作硬件联络控制信号。
目前使用的串口连接线有DB9和DB25两种连接器,用户可以国家使用的具体机器选择相应的连接器。
一个串口通讯类在/network/serialport.shtml。
PC机的RS-232接口的电平标准是-12V标示“1”,和+12V表示“0”,有些单片机的信号电平时TTL 型,即大于2.4v表示“1”,小于0.5v表示“0”,因此采用RS-232总线进行异步通信是,发送端和接受端要有一个电平转换接口。
串口通讯方法的三种实现串口是计算机上一种非常通用的设备通信协议。
大多数计算机包含两个基于RS232的串口。
串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS一232口。
同时,串口通信协议也可以用于获取远程采集设备的数据。
串口通信(Serial Communication),是指外设和计算机间,通过数据信号线、地线、控制线等,按位进行传输数据的一种通讯方式。
串口通信方便易行,应用广泛。
在Windows应用程序的开发中,我们常常需要面临与外围数据源设备通信的问题。
在VC++中有两种方法可以进行串口通讯。
一种是利用Microsoft公司提供的ActiveX 控件Microsoft Communications Control。
另一种是直接用VC++访问串口。
下面将简述这两种方法。
一、Microsoft Communications ControlMicrosoft公司在WINDOWS中提供了一个串口通讯控件,用它,我们可以很简单的利用串口进行通讯。
在使用它之前,应将控件加在应用程序的对话框上。
然后再用ClassWizard 生成相应的对象。
现在我们可以使用它了。
该控件有很多自己的属性,你可以通过它的属性窗口来设置,也可以用程序设置。
我推荐用程序设置,这样更灵活。
SetCommPort:指定使用的串口。
GetCommPort:得到当前使用的串口。
SetSettings:指定串口的参数。
一般设为默认参数"9600,N,8,1"。
这样方便与其他串口进行通讯。
GetSettings:取得串口参数。
SetPortOpen:打开或关闭串口,当一个程序打开串口时,另外的程序将无法使用该串口。
GetPortOpen:取得串口状态。
GetInBufferCount:输入缓冲区中接受到的字符数。
SetInPutLen:一次读取输入缓冲区的字符数。
设置为0时,程序将读取缓冲区的全部字符。
GetInPut:读取输入缓冲区。
GetOutBufferCount:输出缓冲区中待发送的字符数。
SetOutPut:写入输出缓冲区。
一般而言,使用上述函数和属性就可以进行串口通讯了。
以下是一个范例。
#define MESSAGELENGTH 100class CMyDialog : public CDialog{protected:VARIANT InBuffer;VARIANT OutBuffer;CMSComm m_Com;public:......}BOOL CMyDiaLog::OnInitDialog(){CDialog::OnInitDialog();m_Com.SetCommPort(1);if (!m_Com.GetPortOpen()) {m_Com.SetSettings("57600,N,8,1");m_Com.SetPortOpen(true);m_Com.SetInBufferCount(0);SetTimer(1,10,NULL);InBuffer.bstrVal=new unsigned short[MESSAGELENGTH]; OutBuffer.bstrVal=new unsigned short[MESSAGELENGTH]; OutBuffer.vt=VT_BSTR;}return true;}void CMyDiaLog::OnTimer(UINT nIDEvent){if (m_Com.GetInBufferCount()>=MESSAGELENGTH) { InBuffer=m_Com.GetInput();// handle the InBuffer.// Fill the OutBuffer.m_Com.SetOutput(OutBuffer);}CDialog::OnTimer(nIDEvent);}用该控件传输的数据是UNICODE格式。
VC实现串行通讯的三种途径
介绍了串行通讯的基本原理,以及在Win98,Win2000环境下实现串行通讯的三种方法,并给出了用Visual C++6.0编写的相应的应用程序。
关键词:VC,串行通讯,CserialPort类,Win API
随着计算机系统的应用和微机网络的发展,计算机同外设间的通讯功能越发显得重要。
其中,串行通讯因具有连接简单、使用灵活方便、数据传递可靠等优点,在工业监控、数据采集和实时控制系统中得到了广泛的应用。
1 串行通讯的基本原理
所谓“串行通讯”是指外设和计算机间使用了数据线、控制线和地线,数据在数据线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。
这种通讯方式使用的数据线少,在远距离通讯中可以节约通讯成本,当然,其传输速度比并行传输慢。
计算机与外部设备进行数据交换往往采用RS-232进行接收,上传数据和指令,如图1所示。
在Windows环境(Win98、Windows2000)下,串口是系统资源的一部分。
应用程序要使用串口进行通讯,必须在使用之前向操作系统提出资源申请要求,即打开串口,通讯完成后必须释放资源,即关闭串口。
2 利用MSComm控件
2.1 简介MSComm控件
MSComm控件在编程时非常方便,而且在VC、VB、Delphi等语言中均可使用。
MSCom m是Microsoft公司提供的简化Windows串行通讯编程的ActiveX控件,它为应用程序提供了处理串行通讯的两种方法:一是数据驱动方法,一是查询法。
2.2 编程实现
在使用MSComm控件开发失重秤采样显示的程序中,采用了事件驱动法,这种方法是在接收到数据时触发事件并获取缓冲区的数据,下面是其实现程序:
第一步,利用MFC向导建立基于对话框的应用程序CcommDlg,在项目中插入Mscomm 控件。
第二步,初始化MSComm控件的参数,现场采样与计算机进行串口通讯时采用8个数据位、1个停止位,无校验,波特率9600。
其中,编辑框m_sDisplay用来显示所得数据,数据以*开始,以$结束,主要如下:
首先,要在CCommDlg.h头文件中包含#include“MSComm.h”,在类中定义public CM SComm m_
第三步,对话框建立响应MSComm事件的处理函数,每当MSComm控件触发事件时该函数将被调用。
这个函数是用来处理串口消息事件的,每当串口接收到数据,就会产生一个串口接收数据的消息事件,我们在OnComm()函数中加入响应的处理代码就能实现自己想要的功能了:
}//当然这只是个非常简单的示例,我们可以在这里假如我们需要的复杂的通讯任务
}
第四步,发送数据,先加入一个处理函数,在事件中加入如下的程序,其中,m_strSend 是所要发送的Cstring变量。
在处理函数中加入:
3 利用CserialPort类进行串口通讯
3.1 选用CserialPort类
的确,使用MSComm控件非常方便,但如果要控制复杂的系统,需要使用多个串口,MS Comm控件就有许多不便,这种情况我们就可以选用CserialPort类,这是rimon spekreij se写的一个串口类,可以从下面网址下载:
work.serialport.shtml
3.2 编程实现
同样,我们用开发失重秤采样显示的程序来说明怎样使用此类,数据通讯的过程也使用了起始标志*和结束标志$。
第一步,建立一个基于单文档的MFC应用程序CcommView,将CserialPort.h和Cserial Port.cpp两个类文件复制到工程文件夹中,用project-add to project-files命令将上述两个文件加入工程。
并在CcommView.h中将头文件中包涵文件CserialPort.h,#include”Serial Port.h”;
第二步,人工增加串口消息响应函数:OnCommunication(WPARAM ch.LPARAM port) 首先,在CcommView.h中加入串口接收的响应函数声明,由于没有自动的消息映射机制,我们必须在消息映射机制的标志处手工添加:
第四步,在OmCommunication(WPARAM ch,LPARAM port)函数中进行数据处理,每当串口接收缓冲区内有一个字符时,就会产生一个WM_COMM_RXCHAR消息,触发O nCommunication函数,这样,就可以在函数中进行数据处理。
4 使用API通讯函数
4.1 用Win API函数对串口进行操作
在Win API函数中对串口进行操作不是对端口进行直接读写的,而是把所有的设备都看成是文件,从而进行相应的文件操作。
4.2 编程实现
第一步,在MainFrm.cpp定义全局变量HANDLE hCom;//准备打开的串口的句柄H ANDLE hCommWatchThread;//辅助线程的全局函数
第二步,打开串口,设置串口hCom=CreateFile("COM1",GENERIC_READ|GENER IC_WRITE,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);//这里,我们使用FILE_FLAG_OVERLAPPED结构,这正是使用API函数实现非阻塞通讯的关键所在。
第三步,启动一个辅助线程,用于串口事件的处理。
这里用它来监视串口状态,主线程则可专心进行数据处理。
第四步,要为辅助线程写一个全局函数,主要完成数据接收的工作。
5 结束语
VC开发系统从底层到上层直接面向用户,而且具有强大的调试功能,因此,越来越多地被广大的程序员使用。
过程控制领域中,和串口打交道是不可避免的,用这三种方式基本可以完成串口通讯的问题,但我们要根据不同的需要选用不同的方法,使我们的程序精巧且实用,这三种方法在我们的失重秤测控系统、齿轮箱扭矩监控系统和心电仪设备的初步研究中都一一得到了验证。
参考文献
1 David J.Kruglinski.Visual C++技术内幕.北京:清华大学出版社,1999
2 Kate Gregory.Visual C++开发使用手册.北京:机械工业出版社,1999
3 邓华,毛岩,吉正.Visual C++案例教程.中科多媒体电子出版社,1999
4 (美)Marshall Braint,Lance Lovette.MFC开发人员指南.北京:机械工业出版社,20 00
5 姚燕南,薛匀义.微机原理.西安:西安电子科技大学出版社,1998。