您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 机器视觉之C++串口编程实例
深圳稻草人自动化培训串口编程实例在windows程序设计与开发过程中,特别是涉及到开发嵌入式软硬件系统时,往往会涉及到串口编程。网上以及一些书籍上讲解windows下的串口编程知识也挺多的,但我个人觉得,看完书上的知识点有时依然不知道该如何下手开始自己的程序设计和代码编写,许多知识如果能结合着详细的例子往往能够帮助我们学习得更快,所以,在此,我专门为串口编程初学者设计了一个详细的例子,供大家参考和学习。下面我将自己用C++编写的串口通信的例子贴出来,其特点如下:1.本例子使用了比较规范的软件设计方法,类的设计具有比较好的可扩展性和移植性、代码的注释采用doxgen支持的javaDoc风格。2.为了能方便初学者更快地了解和入门,几乎每一行代码都加上了详细的注释,对于注释中如果依然有不清楚的概念,相信你通过百度和google一定能找到答案。3.本例子设计的串口操作类可以直接移植到其他的工程中去,大家也可以根据自己的需要添加其他的接口。4.本例子只实现了串口数据的基本收发功能,其实为了保证串口数据传输的正确性,往往需要设计一些串口通信协议,协议的设计有待你自己完成,如果以后有时间,我也会尝试提供一种比较基本的串口通信协议设计案例给大家学习。5.关于本程序的验证方法,可以使用虚拟串口软件VSPM和串口调试助手进行程序的测试与验证,上述两个软件的使用方法请参考:下面即为例子工程的三个文件,SerialPort.h、SerialPort.cpp、maincpp附件中是工程文件,需要使用vs2008打开。1.//////////////////////////////////////////////////////////////////////////2.///COPYRIGHTNOTICE3.///Copyright(c)2009,华中科技大学tickTickGroup(版权声明)4.///Allrightsreserved.5.///6.///@fileSerialPort.h7.///@brief串口通信类头文件8.///9.///本文件完成串口通信类的声明深圳稻草人自动化培训@version1.012.///@author卢俊13.///@E-mail:lujun.hust@gmail.com14.///@date2010/03/1915.///16.///修订说明:17.//////////////////////////////////////////////////////////////////////////18.19.#ifndefSERIALPORT_H_20.#defineSERIALPORT_H_21.22.#includeWindows.h23.24./**串口通信类25.*26.*本类实现了对串口的基本操作27.*例如监听发到指定串口的数据、发送指定数据到串口28.*/29.classCSerialPort30.{31.public:32.CSerialPort(void);33.~CSerialPort(void);34.35.public:36.37./**初始化串口函数38.*39.*@param:UINTportNo串口编号,默认值为1,即COM1,注意,尽量不要大于940.*@param:UINTbaud波特率,默认为960041.*@param:charparity是否进行奇偶校验,'Y'表示需要奇偶校验,'N'表示不需要奇偶校验42.*@param:UINTdatabits数据位的个数,默认值为8个数据位43.*@param:UINTstopsbits停止位使用格式,默认值为144.*@param:DWORDdwCommEvents默认为EV_RXCHAR,即只要收发任意一个字符,则产生一个事件45.*@return:bool初始化是否成功46.*@note:在使用其他本类提供的函数前,请先调用本函数进行串口的初始化47.*\n本函数提供了一些常用的串口参数设置,若需要自行设置详细的DCB参数,可使用重载函数48.*\n本串口类析构时会自动关闭串口,无需额外执行关闭串口49.*@see:50.*/深圳稻草人自动化培训(UINTportNo=1,UINTbaud=CBR_9600,charparity='N',UINTdatabits=8,UINTstopsbits=1,DWORDdwCommEvents=EV_RXCHAR);52.53./**串口初始化函数54.*55.*本函数提供直接根据DCB参数设置串口参数56.*@param:UINTportNo57.*@param:constLPDCB&plDCB58.*@return:bool初始化是否成功59.*@note:本函数提供用户自定义地串口初始化参数60.*@see:61.*/62.boolInitPort(UINTportNo,constLPDCB&plDCB);63.64./**开启监听线程65.*66.*本监听线程完成对串口数据的监听,并将接收到的数据打印到屏幕输出67.*@return:bool操作是否成功68.*@note:当线程已经处于开启状态时,返回flase69.*@see:70.*/71.boolOpenListenThread();72.73./**关闭监听线程74.*75.*76.*@return:bool操作是否成功77.*@note:调用本函数后,监听串口的线程将会被关闭78.*@see:79.*/80.boolCloseListenTread();81.82./**向串口写数据83.*84.*将缓冲区中的数据写入到串口85.*@param:unsignedchar*pData指向需要写入串口的数据缓冲区86.*@param:unsignedintlength需要写入的数据长度87.*@return:bool操作是否成功88.*@note:length不要大于pData所指向缓冲区的大小89.*@see:90.*/91.boolWriteData(unsignedchar*pData,unsignedintlength);92.93./**获取串口缓冲区中的字节数深圳稻草人自动化培训*95.*96.*@return:UINT操作是否成功97.*@note:当串口缓冲区中无数据时,返回098.*@see:99.*/100.UINTGetBytesInCOM();101.102./**读取串口接收缓冲区中一个字节的数据103.*104.*105.*@param:char&cRecved存放读取数据的字符变量106.*@return:bool读取是否成功107.*@note:108.*@see:109.*/110.boolReadChar(char&cRecved);111.112.private:113.114./**打开串口115.*116.*117.*@param:UINTportNo串口设备号118.*@return:bool打开是否成功119.*@note:120.*@see:121.*/122.boolopenPort(UINTportNo);123.124./**关闭串口125.*126.*127.*@return:void操作是否成功128.*@note:129.*@see:130.*/131.voidClosePort();132.133./**串口监听线程134.*135.*监听来自串口的数据和信息136.*@param:void*pParam线程参数137.*@return:UINTWINAPI线程返回值深圳稻草人自动化培训*@note:139.*@see:140.*/141.staticUINTWINAPIListenThread(void*pParam);142.143.private:144.145./**串口句柄*/146.HANDLEm_hComm;147.148./**线程退出标志变量*/149.staticbools_bExit;150.151./**线程句柄*/152.volatileHANDLEm_hListenThread;153.154./**同步互斥,临界区保护*/155.CRITICAL_SECTIONm_csCommunicationSync;//!互斥操作串口156.157.};158.159.#endif//SERIALPORT_H_1.//////////////////////////////////////////////////////////////////////////2.///COPYRIGHTNOTICE3.///Copyright(c)2009,华中科技大学tickTickGroup(版权声明)4.///Allrightsreserved.5.///6.///@fileSerialPort.cpp7.///@brief串口通信类的实现文件8.///9.///本文件为串口通信类的实现代码10.///11.///@version1.012.///@author卢俊13.///@E-mail:lujun.hust@gmail.com14.///@date2010/03/1915.///16.///17.///修订说明:18.//////////////////////////////////////////////////////////////////////////19.20.#includeStdAfx.h21.#includeSerialPort.h深圳稻草人自动化培训**线程退出标志*/26.boolCSerialPort::s_bExit=false;27./**当串口无数据时,sleep至下次查询间隔的时间,单位:秒*/28.constUINTSLEEP_TIME_INTERVAL=5;29.30.CSerialPort::CSerialPort(void)31.:m_hListenThread(INVALID_HANDLE_VALUE)32.{33.m_hComm=INVALID_HANDLE_VALUE;34.m_hListenThread=INVALID_HANDLE_VALUE;35.36.InitializeCriticalSection(&m_csCommunicationSync);37.38.}39.40.CSerialPort::~CSerialPort(void)41.{42.CloseListenTread();43.ClosePort();44.DeleteCriticalSection(&m_csCommunicationSync);45.}46.47.boolCSerialPort::InitPort(UINTportNo/*=1*/,UINTbaud/*=CBR_9600*/,charparity/*='N'*/,48.UINTdatabits/*=8*/,UINTstopsbits/*=1*/,DWORDdwCommEvents/*=EV_RXCHAR*/)49.{50.51./**临时变量,将制定参数转化为字符串形式,以构造DCB结构*/52.charszDCBparam[50];53.sprintf_s(szDCBparam,baud=%dparity=%cdata=%dst
本文标题:机器视觉之C++串口编程实例
链接地址:https://www.777doc.com/doc-2325375 .html