VC操作串口
VC串口通信实例 MSComm
VC串口通信实例 MSComm计算机与外界的信息交换称为通信。
基本的通信方式有并行通信和串行通信两种。
串行通信是指一条信息额各位数据被逐位按顺序传送的通信方式。
随着计算机技术的发展和推广,利用串口进行数据通讯在通讯领域中占有着重要的地位。
串行通信的特点是:数据位传送,按位顺序进行,最少只需要一根传输线即可完成,成本低但传送速度慢。
串行通信的距离可以从几米到几千米。
利用串口进行数据通讯在通讯领域中占有着重要的地位,串口通讯在通讯软件中有着十分广泛的应用。
如电话、传真、视频和各种控制等。
串口通讯目前流行的方法大概有三种:一是利用Microsoft提供的CMSCOMM控件进行通讯,不过现在很多程序员都觉应该放弃这种方式。
二是利用WINAPI函数进行编程,这种编程的难度高,要求掌握很多的API 函数。
三是利用现在网络上面提供的一些串口通讯控件进行编写。
这三种方法都没有同Windows服务联系起来。
串行接口输入输出过程描述串行接口包括4个主要寄存器,即控制寄存器、状态寄存器、数据输入寄存器及数据输出寄存器。
控制寄存器用来接收CPU送给此接口的各种控制信息,而控制信息决定接口的工作方式。
状态寄存器的各位叫状态位,每一个状态位都可以用来指示传输过程中的某一种错误或当前传输状态。
数据输入寄存器总是和串行输入/并行输出移位寄存器配对使用的。
在输入过程中,数据一位一位从外部设备进入接口的寄存器,当接收完一个数据后,数据就从移位寄存器送到输入寄存器,再等待CPU来取走。
输出的情况与输入过程类似,在输出过程中,数据输出寄存器与并行输入/串行输出移位寄存器配对使用。
当CPU往数据输出寄存器中输出一个数据后,数据便传输到移位寄存器,然后一位一位地通过输出线送到外设。
串行通信数据的收发方式分为异步通信方式与同步通信方式。
本文档中详细描述了这次实现的应用程序中的串口通信服务的原理和工作流程,还列举出了相关的核心代码。
用简洁的语言来描述了各个模块的逻辑实现。
VC++串口通信编程
在工业控制中,工控机(一般都基于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上位机MFC利用串口控件发送接收数据
1.建立项目:打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest;2.在项目中插入MSComm控件选择Project菜单下Add To Project子菜单中的Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项(稍等一会,这个过程较慢),则所有注册过的ActiveX控件出现在列表框中。
选择Microsoft Communications Control, version 6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。
(如果你在控件列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安装VC6时没有把ActiveX 一项选上,重新安装VC6,选上ActiveX就可以了),这时在ClassView视窗中就可以看到CMSComm类了,(注意:此类在ClassWizard中看不到,重构clw文件也一样),并且在控件工具栏Controls中出现了电话图标(如图1所示),现在要做的是用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的。
3.利用ClassWizard定义CMSComm类控制对象打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1添加控制变量:m_ctrlComm,这时你可以看一看,在对话框头文件中自动加入了//{{AFX_INCLUDES() #i nclude "mscomm.h"//}}AFX_INCLUDES 。
4.在对话框中添加控件向主对话框中添加两个编辑框,一个用于接收显示数据ID为IDC_EDIT_RXDATA,另一个用于输入发送数据,ID为IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其ID设为IDC_BUTTON_MANUALSEND。
VC 串口编程基础之如何用 VC 打开串口和关闭串口
VC 串口编程基础之如何用VC 打开串口和关闭串口在对串口进行操作之前都需要先打开串口,VC 串口编程方法分为利用VC 串口控件(或VC 串口类)和直接调用Windows底层API函数(我称之为VC API 串口编程)两种方法,不管哪种方法,其实质都是利用底层API函数对串口进行操作,这里我们来看怎么利用API函数来用VC 打开串口。
在Windows 32位以上操作系统(Win98以上)中,将串口(包括其它通信设备)作为文件来处理,所以串口的打开、读写和关闭所用API函数与文件操作函数一样。
所以打开串口用CreateFile,读串口用ReadFile,写串口用WriteFile,关闭串口用CloseHandle。
一、用VC 打开串口、关闭串口的API函数1、打开串口用CreateFile,其声明如下:1HANDLE CreateFile(2LPCTSTR lpFileName, // file name3DWORD dwDesiredAccess, // access mode4DWORD dwShareMode, // sha re mode5LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD6DWORD dwCreationDisposition, // how to create7DWORD dwFlagsAndAttributes, // file attributes8HANDLE hTemplateFile // handle to template file9);部分参数解释如下:●lpFileNam e:指定要打开的串口逻辑名,用字符串表示,如“COM1”和“COM2”分别表示串口1和串口2,若要知道您的电脑有哪此串口,可以打开设备管理器查看,如下图所示,或用丁丁串口调试助手,这个工具启动后会枚举系统当前存在的串口。
●dwDesiredAccess:访问类型,有读(dwDesiredAccess=GENERIC_READ)、写(dwDesiredAccess=GENERIC_WRITE)或两者兼有((dwDesiredAccess=GENERIC_READ | GENERIC_WRITE)。
在VS(VC)2010中使用MSComm控件实现串口通信的详细步骤
// TODO: 在¨²此ä?添¬¨ª加¨®控?件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码? }
void CCommTestDlg::OnBnClickedButtonOpen() { // TODO: 在¨²此ä?添¬¨ª加¨®控?件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码? }
10. 添加关闭串口按钮的消息响应函数 void CCommTestDlg::OnBnClickedButtonClose() { // TODO: 在此添加控件通知处理程序代码 m_mscomm.put_PortOpen(FALSE);//关闭串口 AfxMessageBox(_T("串口 1 已关闭")); } 11. 添加发送按钮消息响应函数 void CCommTestDlg::OnBnClickedButtonSend() { // TODO: 在此添加控件通知处理程序代码 UpdateData(true); //读取编辑框内容 m_mscomm.put_Output(COleVariant(m_EditSend));//发送数据 m_EditSend.Empty(); //发送后清空输入框 UpdateData(false); //更新编辑框内容 } 12. 接收数据 void CCommTestDlg::OnCommMscomm1() { // TODO: 在此处添加消息处理程序代码 static unsigned int cnt=0; VARIANT variant_inp; COleSafeArray safearray_inp; long len,k; unsigned int data[1024]={0}; byte rxdata[1024]; //设置 BYTE 数组 CString strtemp; if(m_mscomm.get_CommEvent()==2) //值为 2 表示接收缓冲区内有字符 {
c语言串口编程实例
c语言串口编程实例摘要:1.串口编程基础2.C 语言串口编程步骤3.C 语言串口编程实例4.实例详解5.总结正文:一、串口编程基础串口编程是指通过计算机串行接口进行数据通信的编程方式。
串口(Serial Port)是一种计算机硬件接口,可以通过串行通信传输数据。
与并行通信相比,串行通信只需一条数据线,传输速度较慢,但具有线路简单、成本低的优点。
因此,串口编程在电子设备、计算机外设、通信设备等领域有广泛的应用。
二、C 语言串口编程步骤1.包含头文件:在使用C 语言进行串口编程时,首先需要包含头文件`<reg52.h>`或`<intrins.h>`。
2.配置串口:配置串口包括设置波特率、数据位、停止位、奇偶校验等参数。
3.初始化串口:初始化串口主要是初始化串口硬件,如配置UART(通用异步收发器)等。
4.打开串口:打开串口是指使能串口通信功能,以便数据传输。
5.读写串口:通过`in`和`out`语句实现数据的输入输出。
6.关闭串口:在数据传输完成后,需要关闭串口以节省资源。
7.串口通信:通过循环寄存器、缓存寄存器或FIFO(先进先出)等方法实现数据的收发。
三、C 语言串口编程实例以下是一个简单的C 语言串口编程实例,该实例通过串口发送数据“Hello, World!”:```c#include <reg52.h>#include <intrins.h>sbit UART_TXD = P3^1; // 配置UART TXD 引脚void init_uart(); // 初始化UART 函数void send_data(unsigned char dat); // 发送数据函数void main(){init_uart(); // 初始化UARTsend_data("H"); // 发送字符"H"send_data("e"); // 发送字符"e"send_data("l"); // 发送字符"l"send_data("l"); // 发送字符"o"send_data(" "); // 发送空格send_data("W"); // 发送字符"W"send_data("o"); // 发送字符"r"send_data("r"); // 发送字符"l"send_data("d"); // 发送字符"d"while(1); // 循环等待}void init_uart() // 初始化UART 函数{TMOD = 0x20; // 设置定时器1 为工作状态TH1 = 0xfd; // 设置定时器1 的计数值TL1 = 0xfd; // 设置定时器1 的计数值TR1 = 1; // 使能定时器1SCON = 0x40; // 设置串口工作状态ES = 0; // 开总中断EA = 1; // 开总中断允许}void send_data(unsigned char dat) // 发送数据函数{SBUF = dat; // 将数据存入缓存寄存器while(!TI); // 等待发送缓存清空TI = 0; // 清空发送缓存}```四、实例详解1.配置串口:通过设置UART TXD 引脚为P3.1,确定波特率、数据位、停止位和奇偶校验等参数。
VC串口通讯实例
在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++_串口上位机编程实例 附vc串口通信(接收)
VC++串口上位机简单例程(源码及详细步骤)VC++编写简单串口上位机程序串口通信,MCU跟PC通信经常用到的一种通信方式,做界面、写上位机程序的编程语言、编译环境等不少,VB、C#、LABVIEW等等,我会的语言很少,C语言用得比较多,但是还没有找到如何用C语言来写串口通信上位机程序的资料,在图书管理找到了用VC++编写串口上位机的资料,参考书籍,用自己相当蹩脚的C++写出了一个简单的串口上位机程序,分享一下,体验一下单片机和PC通信的乐趣。
编译环境:VC++6.0操作系统:VMWare虚拟出来的Windows XP程序实现功能:1、PC初始化COM1口,使用n81方式,波特率57600与单片机通信。
PC的COM口编号可以通过如下方式修改:当然也可以通过上位机软件编写,通过按钮来选择COM端口号,但是此次仅仅是简单的例程,就没有弄那么复杂了。
COM1口可用的话,会提示串口初始化完毕。
否则会提示串口已经打开Port already open,表示串口已经打开,被占用了。
2、点击开始转换,串口会向单片机发送0xaa,单片机串口中断接收到0xaa后启动ADC 转换一次,并把转换结果ADCL、ADCH共两个字节的结果发送至PC,PC进行数值转换后在窗口里显示。
(见文章末尾图)3、为防止串口被一只占用,点击关闭串口可以关闭COM1,供其它程序使用,点击后按钮变为打开串口,点击可重新打开COM1。
程序的编写:1、打开VC++6.0建立基于对话框的MFC应用程序Test,2、在项目中插入MSComm控件:工程->增加到工程->Components and Controls->双击Registered ActiveX Controls->选择Microsoft Communications Control, version 6.0->Insert,按默认值添加,你会发现多了个电话图标,这是增加后串口通信控件。
用VC实现多串口多线程工业控制
用VC实现多串口多线程工业控制随着工业自动化程度的不断提高,多串口多线程工业控制成为了现代工业系统中的重要组成部分。
使用虚拟串口技术(Virtual COM,简称VC)可以实现多串口多线程工业控制,从而提高工业生产效率和减少人力成本。
本文将详细介绍VC实现多串口多线程工业控制的原理、优势以及应用案例。
一、VC实现多串口多线程工业控制的原理1.1VC基本原理VC技术是一种软件技术,通过创建虚拟串口,将物理串口映射到虚拟串口,使得能够在多个进程或线程之间进行并行通信。
虚拟串口与物理串口完全相同,可以实现对串口的访问和管理,但能够同时在多个线程中使用。
1.2多线程工业控制的基本原理多线程工业控制是指通过多个线程同时进行工业控制操作,实现对多个设备或工艺流程的并行控制。
每个线程负责一个设备或工艺流程的控制,通过线程之间的协同工作,完成整个系统的工业控制过程。
二、VC实现多串口多线程工业控制的优势2.1提高工业生产效率使用VC技术可以实现多个设备或工艺流程的同时控制,减少了串口访问的瓶颈,提高了工业生产效率。
不同设备或工艺流程之间可以同时进行通信和控制,大大缩短了系统的响应时间,提高了整个系统的响应速度。
2.2减少人力成本传统的工业控制系统通常需要大量的人工干预和操作,而使用VC实现多串口多线程工业控制可以实现自动化控制,减少了人力成本。
多个设备或工艺流程之间可以实现自动化交互和控制,减少了人力的干预和操作,提高了工业生产的自动化程度。
2.3提高系统的稳定性和可靠性VC技术可以实现对串口的访问和管理,有效地解决了串口冲突和资源竞争的问题,提高了系统的稳定性和可靠性。
多个设备或工艺流程之间可以独立运行,互不干扰,保证系统的稳定运行。
三、VC实现多串口多线程工业控制的应用案例3.1智能生产线控制系统智能生产线控制系统通常需要对多个设备进行控制和监控,使用VC技术可以实现多串口多线程的工业控制。
每个设备负责一个工序或操作,通过多线程的方式实现对多个设备的并行控制,提高了生产线的效率和稳定性。
VC++串口编程
深入浅出VC++串口编程之基本概念 (1)基于DOS (7)1.BIOS中断 (7)2.硬件中断 (10)3.硬件查询 (15)基于Win32API (17)API描述 (17)例程 (22)基于控件 (28)MSComm控件 (28)例程 (32)第三方串口类 (39)类实现 (39)实例 (55)深入浅出VC++串口编程之基本概念在PC机的主板上,有一种类型的接口可能为我们所忽视,那就是RS-232C串行接口,在微软的Windows系统中称其为COM。
我们可以通过设备管理器来查看COM的硬件参数设置,如图1。
图1 在Windows上查看PC串口设置迄今为止,几乎每一台PC都包含COM。
本质而言,COM是PC为和外界通信所提供的一种串行数据传输的接口。
作为一种物理通信的途径和设备,它和目前风靡的另一种串行接口――USB所提供的功能是一致的。
不过RS-232C显然已经开始被后起之秀USB赶超,因为USB的传输速率已经远远超过了RS-232C。
尽管如此,RS-232C仍然具有非常广泛的应用,在相对长的一段时间里,难以被USB 等接口取代。
RS-232C接口(又称EIA RS-232C),1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定,全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准"。
本文将对这一接口进行硬件原理的介绍,随后我们将逐章学习DOS平台的串口编程,及Windows平台下基于API、控件和第三方类的串口编程,最后本文将给出一个综合实例。
硬件原理众所周知,CPU与存储芯片和I/O芯片的通信是并行的(并行传输的最大位数依赖于CPU的字长、数据总线的宽度),一种叫做UART(通用异步收发器,Universal Asynchronous Receiver/Transmitter)的芯片提供了并行数据传输和RS-232C串行数据传输方式的转换。
vc串口通讯控件MSComm编程详解
vc串口通讯控件MSComm编程详解在mfc中进行串口通讯最简单的方法莫过于在对话框中使用MSCOMM控件了,MSComm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem).还可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工、事件驱动的、高效实用的通信程序。
一、用MSComm控件通信1.串口通信基础知识一般悦来,计算机都有一个或多个串行端口,它们依次为com1、Com2、…,这些串口还提供了外部设备与pC进行数据传输和皿信的通道。
这些串口在CPU和外设之间充当解释器的角色。
当字符数据从CPU 发送给外设时,这些字符数据将被转换成串行比特流数据;当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序(COMM.DRV)调用API函数发送和接收数据,当用通信控件或声明调用API函数时,它门由COMM. DRV解释并传递给设备驱动程序,作为一个vB程序员,要编写通信程序.只需知道通信控件提供给Windows通信AP1函数的接口即可.换句话说,只需设定和监视通信控件的属性和事件即可。
2.使用Mscomm控件在开始使用MSComm控件之前。
需要先了解其属性、事件或错误属性描述CommPort 设置或返回通信端口号Settings 以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位PortOpen 设置或返回通信端口的状态。
也可以打开和关闭端口Input 返回和删除接收缓冲区中的字符Output 将字符串写入发送缓冲区CommEvent属性为通信事件或错误返回下列值之一。
在该控件的对象库中也可以找到这些常量。
常量值描述ComEventBreak 1001 收到了断开信号ComEventCTSTO 1002 Clear To Send Timeout。
VC实现串口通信项目源码
VC实现串口通信项目源码以下是一个简单的串口通信项目的VC实现源码,包括了串口初始化、发送数据、接收数据等基本功能。
```#include <Windows.h>#include <stdio.h>#define BUFFER_SIZE 1024HANDLE hSerial;//初始化串口参数BOOL InitSerialPort//打开串口hSerial = CreateFile("\\\\.\\COM1", GENERIC_READ ,GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (hSerial == INVALID_HANDLE_VALUE)printf("Failed to open serial port\n");return FALSE;}//配置串口参数DCB dcbSerialParams = { 0 };dcbSerialParams.DCBlength = sizeof(dcbSerialParams); printf("Failed to get serial port state\n"); CloseHandle(hSerial);return FALSE;}dcbSerialParams.BaudRate = CBR_9600; // 波特率为9600 dcbSerialParams.ByteSize = 8; // 8位数据位dcbSerialParams.Parity = NOPARITY; // 无奇偶校验dcbSerialParams.StopBits = ONESTOPBIT;// 1位停止位printf("Failed to set serial port state\n"); CloseHandle(hSerial);return FALSE;}//设置超时操作CloseHandle(hSerial);return FALSE;}return TRUE;//发送数据BOOL SendData(const char* data)DWORD bytesWritten;if (!WriteFile(hSerial, data, strlen(data), &bytesWritten, NULL))printf("Failed to send data\n");CloseHandle(hSerial);return FALSE;}return TRUE;//接收数据BOOL ReceiveData(char* buffer, DWORD size)DWORD bytesRead;if (!ReadFile(hSerial, buffer, size, &bytesRead, NULL))printf("Failed to receive data\n");CloseHandle(hSerial);return FALSE;}return TRUE;if (!InitSerialPort()return 1;}char sendBuffer[BUFFER_SIZE];char receiveBuffer[BUFFER_SIZE];//发送数据printf("Enter data to send: ");gets_s(sendBuffer, BUFFER_SIZE);if (!SendData(sendBuffer))return 1;}//接收数据printf("Receiving data...\n");if (!ReceiveData(receiveBuffer, BUFFER_SIZE)) return 1;}printf("Received data: %s\n", receiveBuffer); CloseHandle(hSerial);```这个项目使用了Windows的串口通信API函数来实现串口的初始化、发送数据和接收数据操作。
VC++MSComm串口发送与接收上位机制做总结
VC++MSComm串口发送与接收上位机本设计用VC编写的一个简单的上位机软件,实现功能为:简单的串口数据发送与接收。
具体步骤如下:一.建立应用程序工程“串口通信_韩季方01”1.打开VC++6.0-》建立对话框MFC应用程序:串口通信_韩季方01—》添加基本控件如图1。
0.图1。
02.添加MSComm控件:Add To Project—》Components and Controls…打开如图1.1,双击“Registered ActiveX Contronls”项—》出现如图1.2—》选择“Microsoft Communications Control,version 6。
0"控件—》点击“Insert”—》提示“…”确认即可-》弹出图1.3—》点击“OK”—》再点击“Close”。
下一步,将对话框资源控件中的电话状控件托到对话框中即可,如图1.4。
图1。
1 图1。
2图1.3图1.4 3。
编辑控件及其属性设置:如表1。
0控件控件ID Caption 需要添加的变量及变量类型静态文本IDC_STATIC 接收显示静态文本IDC_STATIC 发送输入编辑框IDC_EDIT_RXDATA m_strEditRXDataValue CString编辑框IDC_EDIT_TXDATA m_strEditTXDataValue CString 按键IDC_BUTTON_MANUALSEND 发送IDC_MSCOMM1 m_ctrlcomm control MSComm控件表1.04。
添加变量及其类型方法如图1.5图1.5二.初始化串口:设置MSComm控件属性打开Class Wizard—》Member Variables-》选IDC_MSCOMM1-》点击“Add Varialbe…"—》添加变量m_ctrlComm。
如图1。
5。
之后,在工作空间打开文件如图2。
0—》在函数OnInitDialog中添加代码如图2.1.图2.0图2。
基于serialport类串口通信的具体步骤(vc++)
1
1、在VC6.0开发环境中,新建基于对话框的MFC应用程序名为exp,并添加主要控件,更改控件ID。
2、用Class Wizard为相应控件添加变量。主要添加的变量为显示类型的,如编辑框、组合框等。
3.添加类文件。下载或者拷贝类文件serialport.h和serialport.cpp复制到工程所在的文件夹下,然后点击VC6.0菜单Project->Add to Project->Files…,选择serialport.h和serialport.cpp点击OK,就把类文件加入了当前工程。
return;
ChuankouDX.WriteToPort(buf);//发送数据
}
3.3
void CExp2Dlg::OnButtonOpen()
{
// TODO: Add your control notification handler code here
int nPort=1; //选择串口COM1
if(ChuankouDX.InitPort(this, nPort, 9600,'N',8,1,EV_RXFLAG | EV_RXCHAR,512))
if(!m_bSerialPortOpened)
return; //检查串口是否打开
char buf[100];
memset(&buf, 0, sizeof(buf));
GetDlgItemText(IDC_send, buf, sizeof(buf));
if (strcmp("NOT FOUND", buf) == 0)
VC中如何从串口读取数据
方法一:使用VC++提供的串行通信控件MSComm 首先,在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project –> Add to Project –> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。
此时,你只需要关心控件提供的对Windows 通讯驱动程序的API 函数的接口。
换句话说,只需要设置和监视MSComm控件的属性和事件。
在ClassWizard中为新创建的通信控件定义成员对象(CMSCommm_Serial),通过该对象便可以对串口属性进行设置,MSComm 控件共有27个属性,这里只介绍其中几个常用属性:CommPort 设置并返回通讯端口号,缺省为COM1。
Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen 设置并返回通讯端口的状态,也可以打开和关闭端口。
Input 从接收缓冲区返回和删除字符。
Output 向发送缓冲区写一个字符串。
InputLen 设置每次Input读入的字符个数,缺省值为0,表明读取接收缓冲区中的全部内容。
InBufferCount 返回接收缓冲区中已接收到的字符数,将其置0可以清除接收缓冲区。
InputMode 定义Input属性获取数据的方式(为0:文本方式;为1:二进制方式)。
RThreshold 和SThreshold 属性,表示在OnComm 事件发生之前,接收缓冲区或发送缓冲区中可以接收的字符数。
以下是通过设置控件属性对串口进行初始化的实例:BOOL CSampleDlg:: PortOpen(){BOOL m_Opened;……m_Serial.SetCommPort(2); // 指定串口号m_Serial.SetSettings(“4800,N,8,1″); // 通信参数设置m_Serial.SetInBufferSize(1024); // 指定接收缓冲区大小m_Serial.SetInBufferCount(0); // 清空接收缓冲区m_Serial.InputMode(1); // 设置数据获取方式m_Serial.SetInputLen(0); // 设置读取方式m_Opened=m_Serail.SetPortOpen(1); // 打开指定的串口return m_Opened;}打开所需串口后,需要考虑串口通信的时机。
vc串口通信编程详解
vc串口通信编程详解
串口通信简介
串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。
一般完成这种功能的电路,我们称为串行接口电路。
串口通信结构
串口通信是指外设和计算机间,通过数据信号线、地线、控制线等,按位进行传输数据的一种通讯方式。
这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。
串口是计算机上一种非常通用的设备通信协议。
大多数计算机(不包括笔记本电脑)包含两个基于RS-232的串口。
串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。
同时,串口通信协议也可以用于获取远程采集设备的数据。
RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。
可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接。
vc串口编程实例
我了,今天就总结这么多,下一篇打算说说vc++在绘图方面的使用。
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
vc串 口 编 程 实 例
今天总结一下使用vc++操作串口的程序,使用vc++编写的串口程序,大致分为一下几种 1.使用Win32 API函数编写串口程序; 2.使用VC++自带的控件MScomm控件; 3.网上有许多程序爱好者自己编写了串口通信类,我们可以下下来使用;
VC++串口通信详解
VC++串口通信详解串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。
本文以VC++为平台进行串口通信编程串口通讯在VC++下实现方式有很多,控件自然是最简单话的方式了,但由于控件只支持对话框程序,有些场合又不需要对话框,所以用Windows API实现是比较好的方式串行通信的操作方式1.同步方式同步方式中,读串口的函数试图在串口的接收缓冲区中读取规定数目的数据,直到规定数目的数据全部被读出或设定的超时时间已到时才返回MTIMEOUTS timeOver;//COMMTIMEOUTS结构用于设置读写函数的等待时间。
2.memset(&&timeOver,0,sizeof(timeOver));3.DWORD timeMultiplier,timeConstant;4.timeOver.ReadTotalTimeoutMultiplier=timeMultiplier;5.timeOver.ReadTotalTimeoutConstant=timeConstant;6.SetCommTimeouts(hComport,&&timeOver);7.……8.ReadFile(hComport,//串口句柄9. inBuffer,//缓冲10. nWantRead,//每次调用ReadFile时,函数试图读出的字节数11. &&nRealRead,//实际读出的字节数12. NULL);//代表ReadFile将采用同步文件读写的方式如果所规定的待读取数据的数目nWantRead较大且设定的超时时间也较长,而接收缓冲区中数据较少,则可能引起线程阻塞。
解决这一问题的方法是检查COMSTAT结构的cbInQue 成员,该成员的大小即为接收缓冲区中处于等待状态的数据的实际个数。
如果令nWantRead 的值等于COMSTAT.cbInQue,就能较好地防止线程阻塞。
VC中如何从串口读取数据
在中为新创建地通信控件定义成员对象(),通过该对象便可以对串口属性进行设置,控件共有个属性,这里只介绍其中几个常用属性:设置并返回通讯端口号,缺省为.以字符串地形式设置并返回波特率、奇偶校验、数据位、停止位.设置并返回通讯端口地状态,也可以打开和关闭端口.从接收缓冲区返回和删除字符.向发送缓冲区写一个字符串.设置每次读入地字符个数,缺省值为,表明读取接收缓冲区中地全部内容.返回接收缓冲区中已接收到地字符数,将其置可以清除接收缓冲区.定义属性获取数据地方式(为:文本方式;为:二进制方式).和属性,表示在事件发生之前,接收缓冲区或发送缓冲区中可以接收地字符数.个人收集整理勿做商业用途以下是通过设置控件属性对串口进行初始化地实例::: (){;……(); 指定串口号(“″); 通信参数设置(); 指定接收缓冲区大小(); 清空接收缓冲区(); 设置数据获取方式(); 设置读取方式(); 打开指定地串口;}个人收集整理勿做商业用途打开所需串口后,需要考虑串口通信地时机.在接收或发送数据过程中,可能需要监视并响应一些事件和错误,所以事件驱动是处理串行端口交互作用地一种非常有效地方法.使用事件和属性捕捉并检查通讯事件和错误地值.发生通讯事件或错误时,将触发事件,属性地值将被改变,应用程序检查属性值并作出相应地反应.在程序中用为控件添加消息处理函数:个人收集整理勿做商业用途(){……(()){:串行口数据接收,处理;}}个人收集整理勿做商业用途方法二:在单线程中实现自定义地串口通信类控件简单易用,但由于必须拿到对话框中使用,在一些需要在线程中实现通信地应用场合,控件地使用显得捉襟见肘.此时,若能够按不同需要定制灵活地串口通信类将弥补控件地不足,以下将介绍如何在单线程中建立自定义地通信类.个人收集整理勿做商业用途该通信类需手动加入头文件与源文件,其基类为,大致建立步骤如下:() 打开串口,获取串口资源句柄通信程序从处指定串口设备及相关地操作属性.再返回一个句柄,该句柄将被用于后续地通信操作,并贯穿整个通信过程. ()函数中有几个值得注意地参数设置:串口共享方式应设为,串口为不可共享设备;创建方式必须为,即打开已有地串口.对于参数,对串口有意义地值是,该标志表明串口采用异步通信模式,可进行重叠操作;若值为,则为同步通信方式,在同步方式下,应用程序将始终控制程序流,直到程序结束,若遭遇通信故障等因素,将导致应用程序地永久等待,所以一般多采用异步通信.个人收集整理勿做商业用途()串口设置串口打开后,其属性被设置为默认值,根据具体需要,通过调用()读取当前串口设备控制块()设置,修改后通过()将其写入.再需注意异步读写地超时控制设置,通过结构设置超时,调用()将结果写入.以下是温度监控程序中串口初始化成员函数:个人收集整理勿做商业用途( ){;( “″,,, );打开串口,异步操作( ) ( );个人收集整理勿做商业用途( );( , ); 获得端口默认设置;;;() ;…… }个人收集整理勿做商业用途()串口读写操作主要运用()与()函数,若为异步通信方式,两函数中最后一个参数为指向结构地非空指针,在读写函数返回值为地情况下,调用()函数,返回值为,表明操作悬挂,即操作转入后台继续执行.此时,可以用()来等待结束信号并设置最长等待时间,举例如下:个人收集整理勿做商业用途;( , ,, , );(){(()){();(());}}(());个人收集整理勿做商业用途定义全局变量作为新建通信类地对象,通过调用类地成员函数即可实现所需串行通信功能.与方法一相比,方法二赋予串行通信程序设计较大地灵活性,端口地读写可选择较简单地查询式,或通过设置与外设数据发送时间间隔相同地定时器:(),进行定时读取或发送.个人收集整理勿做商业用途:: ( ){[];();数据处理}个人收集整理勿做商业用途若对端口数据地响应时间要求较严格,可采用事件驱动读写,定义了种串口通信事件,较常用地有:个人收集整理勿做商业用途: 接收到一个字节,并放入输入缓冲区.: 输出缓冲区中地最后一个字符发送出去.: 接收到事件字符(结构中成员),放入输入缓冲区.在用()指定了有用地事件后,应用程序可调用()来等待事件地发生.()可使()中止.个人收集整理勿做商业用途方法三多线程下实现串行通信方法一,二适用于单线程通信.在很多工业控制系统中,常通过扩展串口连接多个外设,各外设发送数据地重复频率不同,要求后台实时无差错捕捉,采集,处理,记录各端口数据,这就需要在自定义地串行通信类中创建端口监视线程,以便在指定地事件发生时向相关地窗口发送通知消息.个人收集整理勿做商业用途线程地基本概念可详见参考书目,内部地抢先调度程序在活动地线程之间分配时间,区分两种不同类型地线程,一种是用户界面线程(),它包含消息循环或消息泵,用于处理接收到地消息;另一种是工作线程(),它没有消息循环,用于执行后台任务.用于监视串口事件地线程即为工作线程.个人收集整理勿做商业用途多线程通信类地编写在端口地配置,连接部分与单线程通信类相同,在端口配置完毕后,最重要地是根据实际情况,建立多线程之间地同步对象,如信号灯,临界区,事件等,相关细节可参考中地同步类.个人收集整理勿做商业用途一切就绪后即可启动工作线程:*(, 线程函数名() , 传递地参数, 设置线程优先级() , 最大堆栈大小() , 创建标志() ); 安全性标志个人收集整理勿做商业用途同时,在串口事件监视线程中:((>)){(( > ) >)(>);(>); 置同步事件对象为非信号态(); 发送通知消息}}个人收集整理勿做商业用途用()向指定窗口地消息队列发送通知消息,相应地,需要在该窗口建立消息与成员函数间地映射,用将消息与成员函数名关联.个人收集整理勿做商业用途(, ){{()(, )(, )…..}}()资料个人收集整理,勿做商业用途然后在各成员函数中完成对各串口数据地接收处理,但必须保证在下一次监测到有数据到来之前,能够完成所有地中间处理工作.否则将造成数据地捕捉错误.资料个人收集整理,勿做商业用途多线程地实现可以使得各端口独立,准确地实现串行通信,使串口通信具有更广泛地灵活性与严格性,且充分利用了时间.但在具体地实时监控系统中如何协调多个线程,线程之间以何种方式实现同步也是在多线程串行通信程序实现地难点.资料个人收集整理,勿做商业用途一个读串口地函数:;(* ){;资料个人收集整理,勿做商业用途;;*;();();(, , , , ); 接收个字符为实际接收字节数()清空接收缓冲区资料个人收集整理,勿做商业用途( < ; ){* *;资料个人收集整理,勿做商业用途;;}* ‘\′;();;}不是语言是编程环境是编程语言中编写是比较方便地,较好地环境.编程源程序要求用语言来编写,在这裏写一下语言就可以了吧!支持面向对象地程序设计方法,并可以使用地,所开发地软件稳定性好,可移植性强,软件与硬件相互独立也是一种混合型地程序设计语言,既可以支持传统地面向过程地程序设计,也支持现在地面向对象地程序设计(面向对象地方法实现了软件地重用问题,加速了软件地开发过程)既适合作为系统软件地描述语言也适合应用软件地开发语言,与语言比它地错误检查机制更强,还提供了相关地检查类,以编写模块化程度高,可重用性和可维护性佳更适合於大,中型程序地开发.资料个人收集整理,勿做商业用途。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
bInit=TRUE;
return TRUE;
}
BOOL CSeries::Close()
{
if(bInit==FALSE)
{
strErrorMsg="串口已经关闭!";
DWORD dwCreationDistribution, // how to create
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile // handle to file with attributes to copy
return FALSE;
}
bInit=FALSE;
return TRUE;
}
//////////////////////////////////////////////////////////////////////
VC实现串口通信例程
作者:阮帮秋(2001.4)
m_hEndThreadEvent =::CreateEvent(NULL,TRUE,FALSE,NULL);
m_pThreadRead = ::AfxBeginThread(ReadProc,this);
if(!m_pThreadRead)
{
strErrorMsg="创建读串口线程失败!";
BYTE Parity, //奇偶校验位
BYTE ByteSize, //数据位
int BuffCount)
{
if(bInit)
{
strErrorMsg="串口已经被你打开!";
DWORD dwMaxRxQueue; // max Rx bufsize, in bytes
DWORD dwMaxBaud; // max baud rate, in bps
DWORD dwProvSubType; // specific provider type
DWORD dwProvCapabilities; // capabilities supported
0, //不共享
NULL, //默认安全模式
);
lpFileName: 指明串口制备,例:COM1,COM2
dwDesiredAccess: 指明串口存取方式,例:GENERIC_READ|GENERIC_WRITE
dwShareMode: 指明串口共享方式
lpSecurityAttributes: 指明串口的安全属性结构,NULL为缺省安全属性
return FALSE;
}
dcb.BaudRate=BaudRate;
dcb.StopBits=StopBits;
dcb.Parity=Parity;
dcb.ByteSize=ByteSize;
if (SetCommState(m_hComm,&dcb) == 0)
WORD wPacketVersion; // packet version
DWORD dwServiceMask; // services implemented
DWORD dwReserved1; // reserved
DWORD dwMaxTxQueue; // max Tx bufsize, in bytes
OPEN_EXISTING, //打开方式:打开已经存在的端口
NULL,
NULL);
if( m_hComm == INVALID_HANDLE_VALUE )
UINT CSeries::ReadProc(LPVOID lpParam);
BOOL CSeries::Init(int port,
DWORD BaudRate, //波特率
BYTE StopBits, //停止位
dwCreateionDistribution: 必须为OPEN_EXISTIN
dwFlagAndAttributes: 对串口唯一有意义的是FILE_FLAG_OVERLAPPED
hTemplateFile: 必须为NULL
2.关闭串口:
CloseHandle(hCommDev);
DWORD dwCurrentTxQueue; // Tx buffer size, in bytes
DWORD dwCurrentRxQueue; // Rx buffer size, in bytes
DWORD dwProvSpec1; // provider-specific data
DWORD dwDesiredAccess, // access (read-write) mode
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes
return FALSE;
}
portID=port;
char szPort[32];
wsprintf( szPort, "COM%d", portID);
m_hComm = CreateFile( szPort,
GENERIC_READ | GENERIC_WRITE, //读写模式
3.设置缓冲区长度:
BOOL SetupComm(
HANDLE hFile, // handle of communications device
DWORD dwInQueue, // size of input buffer
DWORD dwOutQueue // size of output buffer
comTimeOut.ReadTotalTimeoutConstant = 2; // 读串口数据的固定超时
// 总超时 = ReadTotalTimeoutMultiplier * 字节数 + ReadTotalTimeoutConstant
);
MPROP结构:
可使用GetCommProperties()取得COMMPROP结构,COMMPROP结构中记载了系统支持的各项设置。
typedef struct _COMMPROP { // cmmp
WORD wPacketLength; // packet size, in bytes
பைடு நூலகம்
COMMTIMEOUTS comTimeOut; // COMMTIMEOUTS对象
comTimeOut.ReadIntervalTimeout = 3; // 接收时,两字符间最大的时延
comTimeOut.ReadTotalTimeoutMultiplier = 3; // 读取每字节的超时
return FALSE;
}
SetEvent(m_hEndThreadEvent);
if(CloseHandle(m_hComm) == 0) // 调用该函数关闭串口
{
CString strTemp;
strErrorMsg.Format("串口%d关闭失败!",portID);
comTimeOut.WriteTotalTimeoutMultiplier = 3; // 写每字节的超时
comTimeOut.WriteTotalTimeoutConstant = 2; // 写串口数据的固定超时
SetCommTimeouts(m_hComm,&comTimeOut); // 将超时参数写入设备控制
BAUD_134_5 134.5 bps
BAUD_150 150 bps
BAUD_300 300 bps
BAUD_600 600 bps
{
strErrorMsg.Format("串口%d打开失败!",portID);
return FALSE;
}
DCB dcb;
if (GetCommState(m_hComm,&dcb) == FALSE)
{
strErrorMsg="获取串口配置失败!";
摘要:WIN95界面下的VC++串口通讯程序在WIN32下是不建议对端口进行操作的,在WIN32中所有的设备都被看成是文件,串行口也不例外也是作为文件来进行处理的。
关键词 串行口,DWORD,缓冲区
WIN95界面下的VC++串口通讯程序在WIN32下是不建议对端口进行操作的,在WIN32中所有的设备都被看成是文件,串行口也不例外也是作为文件来进行处理的。这是我的一份关于串口编程的读书笔记,对于使 用VC进行编程的同行应该有一定的帮助。
{
strErrorMsg="设置串口配置失败!";
return FALSE;
}
if(BuffCount > 0)
{
SetupComm(m_hComm, BuffCount , BuffCount);
}
1.打开串口:
在Window 95下串行口作为文件处理,使用文件操作对串行口进行处理。使用CreateFile()打开串口,CreateFile()将返回串口的句柄。
HANDLE CreateFile(
LPCTSTR lpFileName, // pointer to name of the file
DWORD dwProvSpec2; // provider-specific data