首页 > 代码库 > 一个印度人写的VC串口类CSerialCom(有串口基础介绍)
一个印度人写的VC串口类CSerialCom(有串口基础介绍)
一个由印度人编写的VC串口类(也是一种VC串口控件),他还配合这个类写了VC 串口通信方面的一些基础知识,如怎么用VC打开串口,如何对串口进行配置,读串口、写串口等。
这个类有点特别,它没有使用事件驱动原理,它是以查询方式工作的。
简介:
对没有接触过串口通信的VC程序员来说显得非常困难,很久以前我在 codeguru.com 上搜索过串口通信相关信息得到了非常大的帮助,从那时起能编写一个简单易用的VC 串口类是我的梦想。
经过七个月在串口通信编程方面实践经验后,我编写了一个基于API实现的简单串口类,在介绍此串口类之前先介绍一下VC 串口通信方面的基础知识。
串口通信基础:
串口通信每个字节的传输以串行的方式进行,传输时低位先被发送,一个“包”由“开始位”+“数据位”+“奇偶校验位”(不是必需)+“停止位” 组成。
奇偶校验位是可选的,它用来进行错误检测,您可以在软件里设置是否启用奇偶校验,而且还可以选择启用哪种校验方式,如“奇”校验(ODD)或“偶”校验(EVEN)。
PC机通过串口发送和接收数据的流程如下:
1、 | 打开串口 | |
2、 | 配置串口通信参数,如:波特率、校验方式、数据位数等 | |
3、 | 设置通信超时时间 | |
4、 | 写数据 | |
5、 | 读数据 | |
6、 | 关闭串口 |
用VC打开串口:
打开串口可以用API函数 CreateFile() 来实现,打开串口有两种方式,分别为重叠I/O(OVERLAPPED)和非重叠(NON-OVERLAPPED)方式(其实这两种方式分别对应串口的异步和同步通信方式-VC串口通信技术网注)。CSerialCom 类工作于非重叠(NON-OVERLAPPED)模式(即同步通信模式),有关更多OVERLAPPED 和 NON-OVERLAPPED 方面的消息可查询MSDN。
串口配置:
VC 串口通信程序编写最重要的课题就是如何利用 DCB 结构来配置串口,对 DCB 结构填充不正确是大多数人常反犯的毛病,通常串口通信程序编写好后出现这样那样的问题就是因为这个结构没有正确填充所致。在利用 CreateFile() 函数打开串口时就需要我们对串口的波特率、校验方式、数据位、停止位等进行配置。
设置超时时间:
每次打开串口时都必须利用 COMMTIMEOUTS 结构设置超时时间,如果未设置此结构,通信将以默认或上次打开此串口时设置的超时时间为准。
写串口:
WriteFile() 函数可实现这一功能,在执行这一动作之前必须先打开并配置好串口。
读串口:
利用 ReadFile() 可实现这一功能,同样,在执行这一动作之前必须先打开并配置好串口。
关闭串口:
不再使用已经打开的串口后必须关闭它以将此串口资源释放出来,这样其它程序才可能再使用此串口资源,外于非重叠I/O(NON-OVERLAPPED)模式下的串口在打开期间是不能被其它程序或同一程序内的其它线程访问的。使用 CloseHandle() 函数可以关闭串口, CloseHandle() 函数只有一个参数,它是由CreateFile() 打开串口时返回的设置句柄。
CSerialCom 串口类
CSerialCom 类使用六个函数来实现上面提到的功能,它们分别是:
BOOL CSerialCom::OpenPort(CString portname) { portname= "//./" + portname; hComm = CreateFile(portname, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); if(hComm==INVALID_HANDLE_VALUE){ return false;} else return true; }
OpenPort()成员函数用来打开串口,它需要的参数只有一个,就是串口名,如“COM1”,“COM2” 。
// http://www.vc-rs232.com/html/VC_SSCOM_Control/2011/0117/34.html
一个印度人写的VC串口类CSerialCom(有串口基础介绍)