在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
#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);
}