VC++串口编程(基本概念)

合集下载

用c语言实现串口读写程序

用c语言实现串口读写程序

用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函数用来打开串口设备,并设置相应的参数。

VC++串口通信编程

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++6.0实现的串口通讯

基于VC++6.0实现的串口通讯

基于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)。

VC 串口编程基础之如何用 VC 打开串口和关闭串口

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)。

串口vc编程步骤及程序

串口vc编程步骤及程序

1.添加C++类 CCESeries下面是CCESeries.h 文件的内容:#pragma once//定义串口接收数据函数类型//这是一个回调函数,执行该函数时,表示串口接收到了数据。

typedef void (CALLBACK* ONSERIESREAD)(void * pOwner /*父对象指针*/ ,BYTE* buf /*接收到的缓冲区*/,DWORD dwBufLen /*接收到的缓冲区长度*/);class CCESeries{public:CCESeries(void); //CCESeries类的构造函数~CCESeries(void); //CCESeries类的析构函数public://打开串口BOOL OpenPort(void* pOwner,/*指向父指针*/UINT portNo = 1, /*串口号*/UINT baud = 9600, /*波特率*/UINT parity = NOPARITY, /*奇偶校验*/UINT databits = 8, /*数据位*/UINT stopbits = 0 /*停止位*/);//关闭串口void ClosePort();//同步写入数据BOOL WriteSyncPort(const BYTE*buf , DWORD bufLen);//设置串口读取、写入超时BOOL SetSeriesTimeouts(COMMTIMEOUTS CommTimeOuts);//得到串口是否打开BOOL GetComOpened();private://串口读线程函数,该函数被定义成私有静态。

static DWORD WINAPI ReadThreadFunc(LPVOID lparam);private://关闭读线程,当使用完串口后,便调用这个函数退出串口数据接收线程。

void CloseReadThread();private://已打开的串口句柄// HANDLE m_hComm;//读线程句柄HANDLE m_hReadThread;//读线程ID标识DWORD m_dwReadThreadID;//读线程退出事件HANDLE m_hReadCloseEvent;BOOL m_bOpened; //串口是否打开void * m_pOwner; //指定父对象指针public:ONSERIESREAD m_OnSeriesRead; //串口读取回调函数HANDLE m_hComm;};2.下面是CCESeries.cpp文件的内容:#include "StdAfx.h"#include "CESeries.h"//构造函数,将m_hComm初始化为无效的句柄CCESeries::CCESeries(){//初始化内部变量m_hComm = INVALID_HANDLE_VALUE;m_OnSeriesRead = NULL;m_bOpened = 0;}//析构函数,检测如果串口是打开的,则关闭串口CCESeries::~CCESeries(){if (m_bOpened){//关闭串口ClosePort();}}//串口读线程函数,该线程用于异步接收串口数据。

c语言串口编程实例

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,确定波特率、数据位、停止位和奇偶校验等参数。

C#串口通信学习笔记

C#串口通信学习笔记

C#串口通信学习笔记因为参加一个小项目,需要对继电器进行串口控制,所以这两天学习了基本的串口编程。

同事那边有JAVA的串口通信包,不过是从网上下载的,比较零乱,难以准确掌握串口通信的流程和内含。

因此,个人通过学习网上大牛的方法,利用C#实现了基本的串口通信编程。

下面对学习成果进行总结归纳,希望对大家有所帮助。

一、串口通信简介串行接口(串口)是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。

一般完成这种功能的电路,我们称为串行接口电路。

串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。

尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。

串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。

对于两个进行通信的端口,这些参数必须匹配。

1. 波特率:这是一个衡量符号传输速率的参数。

指的是信号被调制以后在单位时间内的变化,即单位时间内载波参数变化的次数,如每秒钟传送960个字符,而每个字符格式包含10位(1个起始位,1个停止位,8个数据位),这时的波特率为960Bd,比特率为10位*960个/秒=9600bps。

2. 数据位:这是衡量通信中实际数据位的参数。

当计算机发送一个信息包,实际的数据往往不会是8位的,标准的值是6、7和8位。

标准的ASCII码是0~127(7位),扩展的ASCII码是0~255(8位)。

3. 停止位:用于表示单个包的最后几位。

典型的值为1,1.5和2位。

由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。

因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。

4. 校验位:在串口通信中一种简单的检错方式。

有四种检错方式:偶、奇、高和低。

当然没有校验位也是可以的。

串口调试助手VC源程序及详细编程过程

串口调试助手VC源程序及详细编程过程

据数留残除清以区冲缓读预先//;)(tupnIteG.mmoClrtc_m 0为度长据数区收接前当置设// ;)0(neLtupnIteS.mmoClrtc_m 件事mmoCnO的据数收接个一发引将时符字个1于等或于多有中区冲缓收接口串当每示表1数参// ; ) 1 ( d l o h s er h T R t e S . m m oCl r t c _ m ; ) 1 ( e d o M tu p n I t e S . m m oCl r t c _ m 据数取检式方制进二以 // 位止停个1�位据数个8�验校无�0069率特波// ;)"1,8,n,0069"(sgnitteSteS.mmoClrtc_m ; )" t r o p l a i r es n e p o t o nn a c " ( x o B e g ass e M x f A esle 口串开打//;)EURT(nepOtroPteS.mmoClrtc_m ) )( n e p O t r o P te G . m m o C l r t c_m ! ( f i 1moc择选// ;)1(troPmmoCteS.mmoClrtc_m ; )E S L A F ( n e p Ot r o P t e S . m m oCl r t c _ m ) ) ( n e p O t r oP t e G . m m o C l rtc _ m ( f i e r e h n o i t az i l a i t i n i a r t x e d d A :OD O T / / �码代下如入加�口串开打)(golaiDtinInO::glDtseTmmoCSC的框话对主在们我在现。口串开打中数函 理处的钮按该在�钮按始开个一做中序程在如例�口串开打候时的要需你在以可你 数 参 口 串 置 设 和 口 串 开 打 . 6
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在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、控件和第三方类的串口编程,最后本文将给出一个综合实例。

在本文的连载过程中,您可以通过如下方式联系作者(热忱欢迎读者朋友对本文的内容提出质疑或给出修改意见):
作者email:21cnbao@(可以来信提问,笔者将力求予以回信解答,并摘取其中的典型问题,在本系列文章最后一次连载的《读者反馈》中予以阐述);
硬件原理
众所周知,CPU与存储芯片和I/O芯片的通信是并行的(并行传输的最大位数依赖于CPU的字长、数据总线的宽度),一种叫做UART(通用异步收发器,Universal Asynchronous
Receiver/Transmitter)的芯片提供了并行数据传输和RS-232C串行数据传输方式的转换。

这样的设备通常有如图2所示的管脚分布,当其向外传输数据时,CPU并行的将数据写入这类芯片的寄存器,UART再将寄存器中的数据一位一位地移动并向外传输;当外界向其传输数据时,UART一位一位地接收数据,并将其移位组合为并行数据,CPU再并行地读取这些数据。

实际上,由于UART芯片一般以TTL/CMOS电平工作,在UART连接接口之前,还要经过一个TTL/CMOS和RS-232C电平的转换。

RS-232C规定了其标准的电气特性,逻辑1对应的电压必须在-5~-15V之间;逻辑0对应的的电压必须在+5~+15V之间。

图2 UART并/串转换
一个常见的TTL/CMOS和RS-232C电平转换芯片如图3。

图3 常见的TTL/CMOS和RS-232C电平转换芯片
RS-232C通常以两类接插件与外界相连,分别称为DB9和DB25,如图4所示。

图4 DB9 和DB25
接插件中各个针的定义则如表1:
表1 DB9和DB25引脚定义
DB9 DB25 针号功能说明缩写针号功能说明缩写
1 数据载波检测 DCD
8 数据载波检测 DCD
3 接收数据 RXD
2 接收数据 RXD
2 发送数据 TXD
3 发送数据 TXD
20 数据终端准备 DTR
4 数据终端准备 DTR
7 信号地 GND
5 信号地 GND
6 数据设备准备好 DSR 6 数据准备好 DSR
4 请求发送 RTS
7 请求发送 RTS
5 清除发送 CTS
8 清除发送 CTS
9 振铃指示 DELL22 振铃指示 DELL
RS-232C定义为数据通信设备(DCE)和数据终端设备(DTE)之间的互连,实现上,
到现在为止,究竟一个设备属于DCE还是属于DTE已经没有明显的界限,PC即可作为DCE,
又可作为DTE。

两串口互连,连接方法主要有二:
一种方法是,数据的发送和接收由软件控制,不进行硬件握手,其连接方法如图5(最
常用DB9连接示意)和表2(DB9、DB25三线连接表),真正需要互相连接的是RXD、
TXD和GND;
图5 无硬件握手时两串口连接
表2 DB9、DB25三线连接
9针-25针
9针-9针5针-25针 2
2 3 3 2 2 2
3 2 2 3 3 3
5 5 7 7 5 7
软件握手又称为XON/XOFF,通常以CTRL-S(0x13)和CTRL-Q(0x11)两个字符来
实现流控制。

前者用于请求对方暂停发送,后者用于清除暂停传送的请求,继续发送数据。

另一种方法是,数据的发送和接收由硬件控制,进行硬件握手,其连接方法如图6(最
常用DB9连接示意),需要连接的信号除RXD、TXD和GND外,还包括DTR、DSR、
RTS和CTS。

硬件握手依赖于RTS和CTS信号,当发送设备欲发送数据时,将RTS信号置为有效表示请求发送,接收设备准备好后,置CTS信号有效,接着发送设备通过信号线TXD开始发送串行数据。

这里我们联想开来,RTS/CTS模式在许多领域里都出现过。

回忆一下IEEE 802.11无线局域网协议标准,在其MAC协议中就使用了RTS/CTS,RTS/CTS抽象开来就是一种请求/应答。

笔者曾经在拙作中多次以实例论证计算机领域里许多知识的相通性,这又是一个明证。

图6 有硬件握手时两串口连接
实际上,目前我们经常使用的是方法一,即只连接RXD、TXD和GND,简单灵活。

另外,串口之间互连还有诸多途径,如图7所示。

图7 其它互连方式。

相关文档
最新文档