Win32 下 C/C++ 串口编程

在windows下,把串口当作是一个文件来操作,打开串口时就像打开文件那样,用完后必须使用关闭文件的函数将串口关闭


与串口通信有关的API函数


HANDLE CreateFile(

     LPCTSTR lpFileName,

     DWORD dwDesiredAccess,

     DWORD dwShareMode,

     LPSECURITY_ATTRIBUTES lpSecurityAttributes,

     DWORD dwCreationDisposition

     DWORD dwFlagsAndAttributes,

     HANDLE hTemplateFile); 


     LPCTSTR lpFileName    文件名称,串口号

     DWORD dwDesiredAccess   文件的访问权限,对串口的f发送为 GENERIC_WRITE ,  串口接收为GENERIC_READ 可以用或 | 连接起来,表示即可发送又可接受

     DWORD dwShareMode     文件共享方式,这里为 0   

     LPSECURITY_ATTRIBUTES lpSecurityAttributes  定义文件的安全特性 

     DWORD dwCreationDisposition   文件存在/不存在时,采取行动。 在这里一定要设为 OPEN_EXISTING

     DWORD dwFlagsAndAttributes    文件的属性和标志  , 这里为 0

     HANDLE hTemplateFile);         用来指定GENERIC_READ路径访问模板文件的句柄,这里设为 0


BOOL CloseHandle( HANDLE hObject );   关闭串口

BOOL GetCommState( HANDLE hFile, LPDCB lpDCB );  获取串口的状态及参数

     lpDCB:设备控制块结构,包含有和串口相关的参数

     在设置串口通信格式时,由于DCB结构比较长,一般先获取现行的DCB结构,再改变其中的参数

     如果返回值不为0表示成功

BOOL SetCommState( HANDLE hFile, LPDCB lpDCB ); 设置串口状态

BOOL WriteFIle(

  HANDLE hFile,

  LPCVOID lpBuffer,

  DWORD nNumberOfBytesToWrite,

  LPWORD ipNumberOfBytesWritten,

  LPOVERLAPPED lpOverlapped    );    


  HANDLE hFile,

  LPCVOID lpBuffer  指向要写入文件的数据缓冲区地址

  DWORD nNumberOfBytesToWrite  要写入的字节数

  LPWORD ipNumberOfBytesWritten  实际写入的字节数

  LPOVERLAPPED lpOverlapped    );     这个可以设为NULL


BOOL ReadFIle(

  HANDLE hFile,

  LPCVOID lpBuffer,

  DWORD nNumberOfBytesToRead,

  LPWORD ipNumberOfBytesRead,

  LPOVERLAPPED lpOverlapped    );    


  HANDLE hFile,

  LPCVOID lpBuffer  指向要写入文件的数据缓冲区地址

  DWORD nNumberOfBytesToRead  要读取的字节数

  LPWORD ipNumberOfBytesRead  实际读取的字节数

  LPOVERLAPPED lpOverlapped    );     这个可以设为NULL

   

其他API

ClearCommError() 清除串口的错误,并获得信息

PurgeComm() 清除串口缓冲区

EscapeCommFunction() 控制串口的硬件状态

SetCommMask() 设置事件的掩码,用来触发事件

WaitCommEvent() 等待设置的通信事件发生

GetCommModemStatus() 取得Modem的状态


一个简单的串口实例:

    该程序是用与从下位机读取方位角度数据,下位机控制 HMC5883L,只向串口发送一次数据

Com.h头文件 

/*
**	用于从串口读取电子罗盘的数据(方位角度)
*/


#ifndef _COM_H_
#define _COM_H_

#include 
#include 

using namespace std;

namespace comm
{
	const int stopBits = 1;
	const int baudrate = 9600;
	const int byteSize = 8;
};

class comHandler
{
public:
	comHandler(void);
	double getAngle(void);
	~comHandler();
private:
	double angle;
	HANDLE port;
};


#endif

 Com.cpp

#include "Com.h"

comHandler::comHandler(void)
{
	/*	打开串口	*/
	port = CreateFile(("\\\\.\\COM13"),GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

	if (port == INVALID_HANDLE_VALUE)
	{
		cout<<"Open Com Err"<angle = atoi(buffer);
}

double comHandler::getAngle(void)
{
	return this->angle;
}

comHandler::~comHandler(void)
{
	CloseHandle(port);
}



你可能感兴趣的:(C/C++)