最近才接触一些c++的编程,对于串口的API也不是太了解,看着别人的程序编了一个小demo,赋值,粘贴,可以直接运行,注释有一部分是API的解释。
#include <tchar.h>
#include <stdio.h>#include <windows.h>
HANDLE hCom; //在Windows程序中,有各种各样的资源(窗口、图标、光标等),系统在创建这些资源时会为它们分配内存,
//并返回标示这些资源的标示号,即句柄。句柄指的是一个核心对象在某一个进程中的唯一索引,而不是指针。
DWORD WINAPI ThreadRead(LPVOID lp) //LPVOID是一个没有类型的指针,可以将任意类型的指针付给LPVOID的对象,然后在使用的时候再转回来
//可以理解成Long类型的指针,指向void型
{
char readBuf[1024]; //定义一个数组
DWORD dw; //定义一个双字变量
while(1)
{
ZeroMemory(&readBuf,1024); //清空readBuf的内容
if(!ReadFile(hCom, readBuf, 1023, &dw, NULL))
{
printf("read buffer error!!\n");
return 0;
}
else
{
if(dw !=0)
{
printf("%s\n",readBuf);
PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
//:函数--清空缓冲区,第一个关键字是句柄,参数dwFlags指定要完成的操作,可以是下列值的组合:
//PURGE_TXABORT 终止所有正在进行的字符输出操作,完成一个正处于等待状态的重叠i/o操作,他将产生一个事件,指明完成了写操作
//PURGE_RXABORT 终止所有正在进行的字符输入操作,完成一个正在进行中的重叠i/o操作,并带有已设置得适当事件
//PURGE_TXCLEAR 这个命令指导设备驱动程序清除输出缓冲区,经常与PURGE_TXABORT 命令标志一起使用
//PURGE_RXCLEAR 这个命令用于设备驱动程序清除输入缓冲区,经常与PURGE_RXABORT 命令标志一起使用
}
}
Sleep(1000);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
system("color 100");
printf("*****************************************************************\n");
printf("\n");
printf("说明:需要设置您的Com num和波特率,如果连接失败,则需要重新设置参数,\n");
printf("如果连接成功,开始接收串口消息,接收消息时按回车键退出程序\n");
printf("\n");
printf("\n");
printf("**********参数设置**********\n");
go1:printf("1、please input your COM num:\n");
int ComNum;
scanf("%d",&ComNum);
printf("2、please input your 波特率:\n");
DWORD Baud_Rate;
scanf("%dd",&Baud_Rate);
TCHAR str[10];
_stprintf(str,"COM%d:",ComNum);
hCom = CreateFile(str,GENERIC_WRITE|GENERIC_READ,NULL,NULL,OPEN_EXISTING,NULL,NULL);
//这是一个多功能的函数,可打开或创建以下对象,并返回可访问的句柄:
//控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道。
if(hCom == INVALID_HANDLE_VALUE)
{
printf("open Com error!\n");
printf("\n");
CloseHandle(hCom); //失败了就关闭句柄
goto go1;
}
else //成功了就继续,不用else也可以
{
printf("open com successed!\n");
}
printf("\n");
printf("\n");
printf("*****************************************************************\n");
SetupComm(hCom,1024,1024);
COMMTIMEOUTS TimeOuts;
//设置和查询通讯设备的超时参数。
//这个参数决定ReadFile, WriteFile, ReadFileEx, 和WriteFileEx 操作设备的行为。
//定义读超时
TimeOuts.ReadIntervalTimeout = MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier = 0;
TimeOuts.ReadTotalTimeoutConstant = 0;
//在通讯过程中接收两个字符之间的最长超时时间,按毫秒计算。
//设置为MAXWORD代表读取操作立即返回那些已接收的数据,即使没有收到任何字符。
//定义写超时
TimeOuts.WriteTotalTimeoutMultiplier = 100;
//乘数用于计算读取操作的总超时时间,按毫秒计算。对于每个读取操作,这个值将乘以要读取的字节数。
TimeOuts.WriteTotalTimeoutConstant = 500;
//一个用于计算对于读取操作的总超时周期的常数,按毫秒计算。
//对每次读取操作,实际总超时时间为ReadTotalTimeoutMultiplier 成员与请求的字节数年的乘积加此值。
SetCommTimeouts(hCom, &TimeOuts); //设置超时
DCB dcb; //Device Control Block
GetCommState(hCom, &dcb);
dcb.BaudRate = Baud_Rate;
dcb.ByteSize = 8; //每个字节有8位
dcb.Parity = NOPARITY; //无奇偶校验位
dcb.StopBits = ONESTOPBIT; //1停止位
SetCommState(hCom, &dcb);
HANDLE hthread = CreateThread(NULL, 0, ThreadRead, NULL, NULL, NULL);
//Windows API函数。该函数在主线程的基础上创建一个新线程。
//HANDLECreateThread(
//LPSECURITY_ATTRIBUTESlpThreadAttributes, //线程安全属性
//DWORDdwStackSize, //堆栈大小
//LPTHREAD_START_ROUTINElpStartAddress, //线程函数
//LPVOIDlpParameter, //线程参数
//DWORDdwCreationFlags, //线程创建属性
//LPDWORDlpThreadId //线程ID
);
getchar();
getchar();
CloseHandle(hthread);
CloseHandle(hCom);
return 0;
}