第一次使用markdown编辑器,很有意思,整理一下使用串口时的资料。写的不够全面,但用于简单的RS485串口连接足够用了。如有错误,请大家指正。
- 1 建立串口连接
HANDLE WINAPI CreateFile(
_In_ LPCTSTR lpFileName, //将要打开的串口号,如“COM1”
_In_ DWORD dwDesiredAccess, //指定串口访问的类型,读取、写入或二者并列;
_In_ DWORD dwShareMode, //指定共享属性,串口要设置为0 独占方式
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, //缺省NULL
_In_ DWORD dwCreationDisposition, //创建方式,串口为打开OPEN_EXISTING
_In_ DWORD dwFlagsAndAttributes, //文件属性:设置同步或异步,一般使用同步,设置0
_In_opt_ HANDLE hTemplateFile //对串口而言该参数必须置为NULL
);
HANDLE m_hCom; //需申请为全局变量
m_hCom=CreateFile(m_charPort, //COM口 m_charPort申请的为cstring类型
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
NULL, //同步方式
NULL);
if(m_hCom==INVALID_HANDLE_VALUE)
{
LOG("打开PIS COM失败!");//LOG为日志文件输出库
return false;
}
- 2 配置串口
SetupComm(m_hCom,1024,1024); //hCom为打开串口返回的句柄,输入缓冲区和输出缓冲区的大小都是1024
COMMTIMEOUTS TimeOuts;
TimeOuts.ReadIntervalTimeout=MAXDWORD; //读间隔超时。接收时,两字符间最大的时延。
TimeOuts.ReadTotalTimeoutMultiplier=0; //读时间系数。读取每字节的超时。
TimeOuts.ReadTotalTimeoutConstant=0; //读时间常量。读串口数据的固定超时。
TimeOuts.WriteTotalTimeoutMultiplier=100;//写时间系数。写每字节的超时。
TimeOuts.WriteTotalTimeoutConstant=500; //写时间常量。写串口数据的固定超时。
//注:总超时 = 时间系数 * 字节数 + 时间常量;
SetCommTimeouts(m_hCom,&TimeOuts); //设置超时
DCB dcb;
GetCommState(m_hCom,&dcb); //获取串口设备的初始状态
dcb.BaudRate=9600; //波特率为9600,串口设备的波特率、字节位数、奇偶校验位、停止位
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=NOPARITY; //无奇偶校验位
dcb.StopBits=ONESTOPBIT; //1个停止位
SetCommState(m_hCom,&dcb); //将信息配置串口
PurgeComm(m_hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);//读写串口前要清空读写缓冲区
- 3 读数据
BOOL ReadFile(
HANDLE hFile, //文件的句柄
LPVOID lpBuffer, //用于保存读入数据的一个缓冲区
DWORD nNumberOfBytesToRead, //要读入的字节数
LPDWORD lpNumberOfBytesRead, //指向实际读取字节数的指针
LPOVERLAPPED lpOverlapped //OVERLAPPED结构体指针
);
DWORD dwBytesRead=DACU_SIZE; //申请的存储所读缓冲区大小
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bReadStat;
ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
//unsigned char m_byteDACU[DACU_SIZE]; 变量申请
bReadStat=ReadFile(m_hCom,m_byteDACU,dwBytesRead,&dwBytesRead,NULL);
if(!bReadStat)
{
LOG("写串口失败!");
dwErrorFlags = GetLastError();
}
- 4 写数据
BOOL WriteFile(
HANDLE hFile, //文件句柄
LPCVOID lpBuffer, //数据缓存区指针
DWORD nNumberOfBytesToWrite, //你要写的字节数
LPDWORD lpNumberOfBytesWritten, //用于保存实际写入字节数的存储区域的指针
LPOVERLAPPED lpOverlapped //OVERLAPPED结构体指针
);
写数据格式同读数据格式;
* 5 关闭串口连接
BOOL CloseHandle(HANDLE hObject);
关闭创建串口连接返回的句柄;
if (m_hCom != INVALID_HANDLE_VALUE)
{
CloseHandle(m_hCom);
}