参考资料:http://www.cnblogs.com/xi52qian/archive/2011/08/30/2159675.html
简单学习了调用串口API,关于数据缓冲的问题查了一些资料,发现两个线程同时对STL的队列进行读写是不允许的(不知道自己实现一个队列可不可以)!!!所以在,读写缓冲区部分添加了临界区!!
程序没写完,本想写成接收IMU的输出保存成txt的说!!!!!
#include <iostream>
#include <windows.h>
#include <process.h>
#include <queue>
using namespace std;
#define MAXSize 100
HANDLE mCOM=NULL;
char str[MAXSize+1];
queue<char> RevArr;
CRITICAL_SECTION csRev;//创建一个临界区,来控制对RevArr的访问
bool* ibKiLL=NULL;//线程的控制开关
bool InitCOM()
{
//创建一个串口句柄
if(!(mCOM=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL)))//打开串口1,同步方式读取
return false;
SetupComm(mCOM,1024,1024);//设定一个缓冲区大小
//设定串口的超时设定
COMMTIMEOUTS TimeOuts;
GetCommTimeouts(mCOM,&TimeOuts);
TimeOuts.ReadIntervalTimeout=1000;//读间隔超时,接收两个字符之间的最大间隔
//从总间隔表示,接收指定数量字符的总时间=总超时系数×字符数量+总超时常数
TimeOuts.ReadTotalTimeoutMultiplier=500;//读总超时系数
TimeOuts.ReadTotalTimeoutConstant=5000;//读总超时常数
TimeOuts.WriteTotalTimeoutConstant=500;//写超时系数
TimeOuts.WriteTotalTimeoutConstant=2000;//写超时常数
SetCommTimeouts(mCOM,&TimeOuts);
//配置串口参数
DCB dcb;
GetCommState(mCOM,&dcb);
dcb.BaudRate=9600;//波特率
dcb.ByteSize=8;//数据位数
dcb.fParity=0;//不使用奇偶校验
dcb.Parity=NOPARITY;//不使用奇偶校验
dcb.StopBits=ONESTOPBIT;//一位停止位
SetCommState(mCOM,&dcb);
return true;
}
void _cdecl RevThreadProc(void* pvoid)
{
bool* isKill=(bool*) pvoid;
//接收线程
bool bReadStat;
DWORD wCount;
while(!(*isKill))
{
bReadStat=ReadFile(mCOM,str,MAXSize,&wCount,NULL);
if(bReadStat)
{
EnterCriticalSection(&csRev);
for(int i=0;i<wCount;i++)
RevArr.push(str[i]);
LeaveCriticalSection(&csRev);
}
else
{
cout<<"接收失败或者超时"<<endl;
}
}
_endthread();
}
void _cdecl DealThreaProc(void* pvoid)
{
bool* isKill=(bool*) pvoid;
//用于数据处理的线程
while(!(*isKill))
{
EnterCriticalSection(&csRev);
if(!RevArr.empty())
{
cout<<RevArr.front();
RevArr.pop();
}
LeaveCriticalSection(&csRev);
}
_endthread();
}
int main(int argc,char* argv[])
{
if(!InitCOM())
{
cout<<"初始化串口失败"<<endl;
return 0;
}
InitializeCriticalSection(&csRev);//初始化临界区
PurgeComm(mCOM,PURGE_TXCLEAR|PURGE_RXCLEAR);//清空读写缓冲区
ibKiLL=new bool;
*ibKiLL=false;
_beginthread(RevThreadProc,0,ibKiLL);//开启接收线程
_beginthread(DealThreaProc,0,ibKiLL);//开启处理线程
*ibKiLL=true;
while(true);
CloseHandle(mCOM);//关闭串口
cout<<endl<<"串口已经关闭"<<endl;
system("pause");
return 0;
}