在windows程序设计与开发过程中,特别是涉及到开发嵌入式软硬件系统时,往往会涉及到串口编程。网上以及一些书籍上讲解windows下的串口编程
知识也挺多的,但我个人觉得,看完书上的知识点有时依然不知道该如何下手开始自己的程序设计和代码编写,许多知识如果能结合着详细的例子往往能够帮助我们
学习得更快,所以,在此,我专门为串口编程初学者设计了一个详细的例子,供大家参考和学习。
下面我将自己用C++编写的串口通信的例子贴出来,其特点如下:
1. 本例子使用了比较规范的软件设计方法,类的设计具有比较好的可扩展性和移植性、代码的注释采用doxgen支持的javaDoc风格。
2. 为了能方便初学者更快地了解和入门,几乎每一行代码都加上了详细的注释,对于注释中如果依然有不清楚的概念,相信你通过百度和google一定能找到答案。
3. 本例子设计的串口操作类可以直接移植到其他的工程中去,大家也可以根据自己的需要添加其他的接口。
4.
本例子只实现了串口数据的基本收发功能,其实为了保证串口数据传输的正确性,往往需要设计一些串口通信协议,协议的设计有待你自己完成,如果以后有时间,
我也会尝试提供一种比较基本的串口通信协议设计案例给大家学习。
5. 关于本程序的验证方法,可以使用虚拟串口软件VSPM和串口调试助手进行程序的测试与验证,上述两个软件的使用方法请参考:http://ticktick.blog.51cto.com/823160/285610
下面即为例子工程的三个文件,SerialPort.h、SerialPort.cpp、maincpp
附件中是工程文件,需要使用vs2008打开
。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
#ifndefSERIALPORT_H_
-
#defineSERIALPORT_H_
-
-
#include<Windows.h>
-
-
-
-
-
-
-
class
CSerialPort
-
{
-
public
:
-
CSerialPort(
void
);
-
~CSerialPort(
void
);
-
-
public
:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
bool
InitPort(
UINT
portNo=1,
UINT
baud=CBR_9600,
char
parity=
'N'
,
UINT
databits=8,
UINT
stopsbits=1,
DWORD
dwCommEvents=EV_RXCHAR);
-
-
-
-
-
-
-
-
-
-
-
bool
InitPort(
UINT
portNo,
const
LPDCB&plDCB);
-
-
-
-
-
-
-
-
-
bool
OpenListenThread();
-
-
-
-
-
-
-
-
-
bool
CloseListenTread();
-
-
-
-
-
-
-
-
-
-
-
bool
WriteData(unsigned
char
*pData,unsigned
int
length);
-
-
-
-
-
-
-
-
-
UINT
GetBytesInCOM();
-
-
-
-
-
-
-
-
-
-
bool
ReadChar(
char
&cRecved);
-
-
private
:
-
-
-
-
-
-
-
-
-
-
bool
openPort(
UINT
portNo);
-
-
-
-
-
-
-
-
-
void
ClosePort();
-
-
-
-
-
-
-
-
-
-
static
UINT
WINAPIListenThread(
void
*pParam);
-
-
private
:
-
-
-
HANDLE
m_hComm;
-
-
-
static
bool
s_bExit;
-
-
-
volatile
HANDLE
m_hListenThread;
-
-
-
CRITICAL_SECTIONm_csCommunicationSync;
-
-
};
-
-
#endif//SERIALPORT_H_
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
#include"StdAfx.h"
-
#include"SerialPort.h"
-
#include<process.h>
-
#include<iostream>
-
-
-
bool
CSerialPort::s_bExit=
false
;
-
-
const
UINT
SLEEP_TIME_INTERVAL=5;
-
-
CSerialPort::CSerialPort(
void
)
-
:m_hListenThread(INVALID_HANDLE_VALUE)
-
{
-
m_hComm=INVALID_HANDLE_VALUE;
-
m_hListenThread=INVALID_HANDLE_VALUE;
-
-
InitializeCriticalSection(&m_csCommunicationSync);
-
-
}
-
-
CSerialPort::~CSerialPort(
void
)
-
{
-
CloseListenTread();
-
ClosePort();
-
DeleteCriticalSection(&m_csCommunicationSync);
-
}
-
-
bool
CSerialPort::InitPort(
UINT
portNo
,
UINT
baud
,
char
parity
,
-
UINT
databits
,
UINT
stopsbits
,
DWORD
dwCommEvents
)
-
{
-
-
-
char
szDCBparam[50];
-
sprintf_s(szDCBparam,
"baud=%dparity=%cdata=%dstop=%d"
,baud,parity,databits,stopsbits);
-
-
-
if
(!openPort(portNo))
-
{
-
return
false
;
-
}
-
-
-
EnterCriticalSection(&m_csCommunicationSync);
-
-
-
BOOL
bIsSuccess=TRUE;
-
-
-
-
-
-
-
-
-
-
-
COMMTIMEOUTSCommTimeouts;
-
CommTimeouts.ReadIntervalTimeout=0;
-
CommTimeouts.ReadTotalTimeoutMultiplier=0;
-
CommTimeouts.ReadTotalTimeoutConstant=0;
-
CommTimeouts.WriteTotalTimeoutMultiplier=0;
-
CommTimeouts.WriteTotalTimeoutConstant=0;
-
if
(bIsSuccess)
-
{
-
bIsSuccess=SetCommTimeouts(m_hComm,&CommTimeouts);
-
}
-
-
DCBdcb;
-
if
(bIsSuccess)
-
{
-
-
DWORD
dwNum=MultiByteToWideChar(CP_ACP,0,szDCBparam,-1,NULL,0);
-
wchar_t
*pwText=
new
wchar_t
[dwNum];
-
if
(!MultiByteToWideChar(CP_ACP,0,szDCBparam,-1,pwText,dwNum))
-
{
-
bIsSuccess=TRUE;
-
}
-
-
-
bIsSuccess=GetCommState(m_hComm,&dcb)&&BuildCommDCB(pwText,&dcb);
-
-
dcb.fRtsControl=RTS_CONTROL_ENABLE;
-
-
-
delete
[]pwText;
-
}
-
-
if
(bIsSuccess)
-
{
-
-
bIsSuccess=SetCommState(m_hComm,&dcb);
-
}
-
-
-
PurgeComm(m_hComm,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT);
-
-
-
LeaveCriticalSection(&m_csCommunicationSync);
-
-
return
bIsSuccess==TRUE;
-
}
-
-
bool
CSerialPort::InitPort(
UINT
portNo,
const
LPDCB&plDCB)
-
{
-
-
if
(!openPort(portNo))
-
{
-
return
false
;
-
}
-
-
-
EnterCriticalSection(&m_csCommunicationSync);
-
-
-
if
(!SetCommState(m_hComm,plDCB))
-
{
-
return
false
;
-
}
-
-
-
PurgeComm(m_hComm,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT);
-
-
-
LeaveCriticalSection(&m_csCommunicationSync);
-
-
return
true
;
-
}
-
-
void
CSerialPort::ClosePort()
-
{
-
-
if
(m_hComm!=INVALID_HANDLE_VALUE)
-
{
-
CloseHandle(m_hComm);
-
m_hComm=INVALID_HANDLE_VALUE;
-
}
-
}
-
-
bool
CSerialPort::openPort(
UINT
portNo)
-
{
-
-
EnterCriticalSection(&m_csCommunicationSync);
-
-
-
char
szPort[50];
-
sprintf_s(szPort,
"COM%d"
,portNo);
-
-
-
m_hComm=CreateFileA(szPort,
-
GENERIC_READ|GENERIC_WRITE,
-
0,
-
NULL,
-
OPEN_EXISTING,
-
0,
-
0);
-
-
-
if
(m_hComm==INVALID_HANDLE_VALUE)
-
{
-
LeaveCriticalSection(&m_csCommunicationSync);
-
return
false
;
-
}
-
-
-
LeaveCriticalSection(&m_csCommunicationSync);
-
-
return
true
;
-
}
-
-
bool
CSerialPort::OpenListenThread()
-
{
-
-
if
(m_hListenThread!=INVALID_HANDLE_VALUE)
-
{
-
-
return
false
;
-
}
-
-
s_bExit=
false
;
-
-
UINT
threadId;
-
-
m_hListenThread=(
HANDLE
)_beginthreadex(NULL,0,ListenThread,
this
,0,&threadId);
-
if
(!m_hListenThread)
-
{
-
return
false
;
-
}
-
-
if
(!SetThreadPriority(m_hListenThread,THREAD_PRIORITY_ABOVE_NORMAL))
-
{
-
return
false
;
-
}
-
-
return
true
;
-
}
-
-
bool
CSerialPort::CloseListenTread()
-
{
-
if
(m_hListenThread!=INVALID_HANDLE_VALUE)
-
{
-
-
s_bExit=
true
;
-
-
-
Sleep(10);
-
-
-
CloseHandle(m_hListenThread);
-
m_hListenThread=INVALID_HANDLE_VALUE;
-
}
-
return
true
;
-
}
-
-
UINT
CSerialPort::GetBytesInCOM()
-
{
-
DWORD
dwError=0;
-
COMSTATcomstat;
-
memset(&comstat,0,
sizeof
(COMSTAT));
-
-
UINT
BytesInQue=0;
-
-
if
(ClearCommError(m_hComm,&dwError,&comstat))
-
{
-
BytesInQue=comstat.cbInQue;
-
}
-
-
return
BytesInQue;
-
}
-
-
UINT
WINAPICSerialPort::ListenThread(
void
*pParam)
-
{
-
-
CSerialPort*pSerialPort=
reinterpret_cast
<CSerialPort*>(pParam);
-
-
-
while
(!pSerialPort->s_bExit)
-
{
-
UINT
BytesInQue=pSerialPort->GetBytesInCOM();
-
-
if
(BytesInQue==0)
-
{
-
Sleep(SLEEP_TIME_INTERVAL);
-
continue
;
-
}
-
-
-
char
cRecved=0x00;
-
do
-
{
-
cRecved=0x00;
-
if
(pSerialPort->ReadChar(cRecved)==
true
)
-
{
-
std::cout<<cRecved;
-
continue
;
-
}
-
}
while
(--BytesInQue);
-
}
-
-
return
0;
-
}
-
-
bool
CSerialPort::ReadChar(
char
&cRecved)
-
{
-
BOOL
bResult=TRUE;
-
DWORD
BytesRead=0;
-
if
(m_hComm==INVALID_HANDLE_VALUE)
-
{
-
return
false
;
-
}
-
-
-
EnterCriticalSection(&m_csCommunicationSync);
-
-
-
bResult=ReadFile(m_hComm,&cRecved,1,&BytesRead,NULL);
-
if
((!bResult))
-
{
-
-
DWORD
dwError=GetLastError();
-
-
-
PurgeComm(m_hComm,PURGE_RXCLEAR|PURGE_RXABORT);
-
LeaveCriticalSection(&m_csCommunicationSync);
-
-
return
false
;
-
}
-
-
-
LeaveCriticalSection(&m_csCommunicationSync);
-
-
return
(BytesRead==1);
-
-
}
-
-
bool
CSerialPort::WriteData(unsigned
char
*pData,unsigned
int
length)
-
{
-
BOOL
bResult=TRUE;
-
DWORD
BytesToSend=0;
-
if
(m_hComm==INVALID_HANDLE_VALUE)
-
{
-
return
false
;
-
}
-
-
-
EnterCriticalSection(&m_csCommunicationSync);
-
-
-
bResult=WriteFile(m_hComm,pData,length,&BytesToSend,NULL);
-
if
(!bResult)
-
{
-
DWORD
dwError=GetLastError();
-
-
PurgeComm(m_hComm,PURGE_RXCLEAR|PURGE_RXABORT);
-
LeaveCriticalSection(&m_csCommunicationSync);
-
-
return
false
;
-
}
-
-
-
LeaveCriticalSection(&m_csCommunicationSync);
-
-
return
true
;
-
}
-
-
-
-
#include"stdafx.h"
-
#include"SerialPort.h"
-
#include<iostream>
-
-
int
_tmain(
int
argc,_TCHAR*argv[])
-
{
-
-
CSerialPortmySerialPort;
-
-
if
(!mySerialPort.InitPort(2))
-
{
-
std::cout<<
"initPortfail!"
<<std::endl;
-
}
-
else
-
{
-
std::cout<<
"initPortsuccess!"
<<std::endl;
-
}
-
-
if
(!mySerialPort.OpenListenThread())
-
{
-
std::cout<<
"OpenListenThreadfail!"
<<std::endl;
-
}
-
else
-
{
-
std::cout<<
"OpenListenThreadsuccess!"
<<std::endl;
-
}
-
-
int
temp;
-
std::cin>>temp;
-
-
return
0;
-
}
-
分享到:
相关推荐
MTK CDC Serial驱动是针对MediaTek(MTK)芯片组的一种通信驱动程序,主要用于通过USB接口实现串行通信。在Android设备开发和测试过程中,尤其是进行ATA(Advanced Telephony Application)相关的测试时,这种驱动...
《深入理解serial-monitor串口监控》 在现代电子设备和嵌入式系统开发中,串口通信扮演着至关重要的角色。它是一种简单而实用的数据传输方式,尤其在调试和测试阶段,通过串口监控工具可以实时查看设备间的通信数据...
**C++跨平台串口库Serial** 在C++编程中,与硬件设备进行通信时,串口通信是一种常见的方法,特别是在嵌入式系统和物联网(IoT)应用中。`serial`库是一个强大的C++库,它允许开发者在多个操作系统上进行串口通信,...
USB-Serial驱动程序是连接USB设备到计算机系统的关键组件,主要负责将USB接口的数据转换成串行通信协议,以便与各种传统的串行设备(如调制解调器、GPS接收器、串口打印机等)进行通信。USB-Serial驱动程序是软件...
### Serial ATA 3.1黄金版相关知识点 #### 一、概述 《Serial ATA 3.1黄金版》是Serial ATA International Organization (SATA-IO) 发布的一个关于Serial ATA (SATA) 规范的重要文档。该版本的发布日期为2011年7月...
### 为Linux系统配置Serial Console #### 一、概述与基础知识 **Serial Console**是一种将计算机系统的控制台输出重定向到串行端口的技术。它允许管理员通过串行连接访问和控制服务器或嵌入式系统,即使在没有图形...
根据USB设备的VID 和PID得到他的serial number。一些开发环境对于多个USB设备(同时插入多个设备),通过serial number区别使用不同的USB设备。 得到USB设备VID和PID方法。插拔一次设备,执行如下命令。 $ sudo dmesg ...
【HSM USB SERIAL DRIVER】是针对硬件安全模块(Hardware Security Module,简称HSM)的USB串行通信驱动程序。在IT行业中,HSM是一种专门设计用于保护敏感数据和密钥的安全设备,它提供了物理和逻辑保护,确保了关键...
《串口复用技术与"Serial Port Splitter"软件详解》 在计算机通信领域,串口,即串行端口,是一种重要的硬件接口,广泛应用于设备间的通信。尤其是在工业自动化、嵌入式系统以及老旧设备的连接中,串口扮演着不可或...
标题 "gadgetserial 驱动 win7可用" 指出这是一款适用于Windows 7操作系统的gadgetserial驱动程序。gadgetserial驱动是用于将USB设备模拟为串行(COM)端口的一种技术,常见于USB转串口适配器或者某些特殊的USB设备...
本文将深入探讨如何使用C语言进行Linux串口编程,主要参考了提供的`serial.c`和`example.c`源代码以及`serial.h`头文件。 首先,我们要理解Linux下的串口设备通常在`/dev`目录下,如`/dev/ttyS0`,`/dev/ttyUSB0`等...
USB-SERIAL驱动软件是连接USB接口设备与计算机进行串行通信的重要软件组件。它允许计算机识别并正确处理USB到串行转换器,使得通过USB端口可以与各种串行设备如调制解调器、GPS接收器、打印机等进行通信。在Windows...
它跟Eltima VSPD(Virtual Serial Port Driver)的功能类似,厂商不同,Fabula公司的软件。这是当前最新版本,带注册机。http://www.fabulatech.com/virtual-serial-port-kit.html ,Create virtual serial ports and ...
USB Serial Controller驱动程序是计算机操作系统与USB到串行适配器之间通信的关键组件。它允许计算机识别并正确处理通过USB接口连接的各种串行设备,如调制解调器、GPS接收器、电子阅读器、打印机、扫描仪等。在...
serial_port_utility_latest 串口调试助手安装包,开箱即用! serial_port_utility_latest 串口调试助手安装包,开箱即用! serial_port_utility_latest 串口调试助手安装包,开箱即用! serial_port_utility_latest...
USB-Serial Controller是一种通用串行总线(USB)设备,它允许通过USB接口与各种串行设备进行通信。在Windows操作系统中,当你连接一个这样的设备时,系统可能会提示你安装USB-Serial Controller的驱动程序。这个...
USB-serial控制器驱动是计算机操作系统与USB到串行转换设备之间通信的关键软件组件。这个压缩包文件"USB-serial controller驱动.rar"很可能包含了用于安装和更新这类设备驱动的必要文件。USB-serial控制器通常指的是...
SerialDebug 是一个串口调试工具,它主要用于帮助电子工程师和软件开发者进行串口通信的调试工作。以下是 SerialDebug 工具的一些主要作用和特点: 1. **基础串口通信功能**:提供打开、关闭、接收、发送数据的基础...
USB-Serial Controller是一种常见的USB到串行接口控制器,它允许USB设备模拟传统的串行通信接口,如RS-232,使得旧的串行设备能够与现代的USB接口兼容。在计算机硬件领域,这种技术被广泛应用,特别是在需要连接串行...
本文将深入探讨“serial-port-utility-latest”这款串口调试工具,解析其功能、应用场景以及如何有效地使用它。 串口调试工具,顾名思义,是专门针对串口通信进行测试和调试的软件。在“serial-port-utility-latest...