串行口API的使用

来源:互联网 发布:网络维护的工作内容 编辑:程序博客网 时间:2024/05/01 15:32

参考资料: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 100HANDLE 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;}


0 0
原创粉丝点击