用 WindowsAPI 编写串口程序;
简单的集成了一下串口最基本的创建,打开,参数设置,可根据实际需求进行增添和修改;
主要头文件:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#define PORTNAME L"COM1"
#define BAUDRATE 115200
#define ReadInterval 0
#define ReadTotalconstant 0
#define ReadTotalMultiplierE 0
#define WriteTotalconstant 0
#define =WriteTotalMultiplier 0
#define INPUTBUFFSIZE 1024
#define OUTPUTBUFFSIZE 1024
HANDLE hCom = INVALID_HANDLE_VALUE;
/*
OVERLAPPED m_overlappedRead;
OVERLAPPED m_overlappedWrite;
*/
//通讯串口是否打开
bool IsOpen()
{
return hCom != INVALID_HANDLE_VALUE;
}
//关闭串口
void ClosePort()
{
if (IsOpen())
{
CloseHandle(hCom);
hCom = INVALID_HANDLE_VALUE;
}
/*
if (m_overlappedRead.hEvent != NULL)
{
CloseHandle(m_overlappedRead.hEvent);
}
if (m_overlappedWrite.hEvent != NULL)
{
CloseHandle(m_overlappedWrite.hEvent);
}
*/
}
//打开串口
bool OpenPort()
{
if (IsOpen())
{
ClosePort();
}
//打开串口;
g_hComm = CreateFile(PORTNAME, //串口号
GENERIC_READ | GENERIC_WRITE, //允许读写
0, //通讯设备必须以独占方式打开
0, //无安全属性
OPEN_EXISTING, //通讯设备已存在
FILE_FLAG_OVERLAPPED, //异步 I/O
0); //通讯设备不能用模板打开
if (g_hComm == INVALID_HANDLE_VALUE)
{
CloseHandle(g_hComm);
AfxMessageBox(L"打开串口失败");
return false;
}
//设置DCB
DCB dcb;
dcb.BaudRate = BAUDRATE;//串口号设置;
dcb.ByteSize = 8;//数据宽度;
dcb.Parity = NOPARITY;//校验位
dcb.StopBits = ONESTOPBIT;//停止位;
bool portStat = SetCommState(g_hComm, &dcb);
if (!portStat)
{
AfxMessageBox(L"DCB设置失败");
return false;
}
//超时设置;
COMMTIMEOUTS timeouts;
//以毫秒为单位指定通信线上两个字符到达之间的最大时间,0 值表示不用间隔限时
timeouts.ReadIntervalTimeout=ReadInterval;
/*以毫秒为单位指定一个常数,用于计算读操作的总限时时间。 每个操作的总限时时间等于 ReadTotalTimeoutMultiplier
成员乘以读操作所需字节数再加上该值的和。成 员的值为0表示读操作不使用限时时间。*/
timeouts.ReadTotalTimeoutConstant=ReadTotalconstant;
/*以毫秒为单位指定一个乘数,该乘数用来计算读操作的总限时时间。每个读操作的总限时时间等于
读操作所需的字节数与该值的乘积。成 员的值为0表示读操作不使用限时时间。*/
timeouts.ReadTotalTimeoutMultiplier=ReadTotalMultiplier;
//与读操作的意义相似;
timeouts.WriteTotalTimeoutConstant=WriteTotalconstant;
timeouts.WriteTotalTimeoutMultiplier=WriteTotalMultiplier;
portStat = SetCommTimeouts(g_hComm, &timeouts);
if (!portStat)
{
AfxMessageBox(L"串口超时设置失败");
return false;
}
//缓冲区大小
portStat = SetupComm(g_hComm, INPUTBUFFSIZE, OUTPUTBUFFSIZE);
if (!portStat)
{
AfxMessageBox(L"串口缓冲区大小设置失败");
return false;
}
//设置事件(接收事件)
portStat = SetCommMask(g_hComm, EV_RXCHAR);
if (!portStat)
{
AfxMessageBox(L"串口事件设置失败");
return false;
}
//清空缓冲区
PurgeComm(g_hComm, PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
return true;
}