串行口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
- 串行口API的使用
- 树莓派串行口的使用方法
- zstack同时使用两个串行口
- MCS-51单片机的串行口
- 串行口RS232的接口定义
- 使用CreateFile()打开COM10及以上串行口
- 使用CreateFile()打开COM10及以上串行口
- 使用CreateFile()打开COM10及以上串行口
- 使用CreateFile()打开COM10及以上串行口
- 使用CreateFile()打开COM10及以上串行口
- 使用CreateFile()打开COM10及以上串行口
- 使用CreateFile()打开COM10及以上串行口
- 使用CreateFile()打开COM10及以上串行口
- Linux 下的串行口通讯编程
- Linux 下的串行口通讯编程
- 9针串行口的针脚功能
- 南邮微机实验 串行口的测试
- ubuntu下的串行口通讯编程
- 国产操作系统逆袭难题:国外起步早 垄断性强
- Ubuntu 12.04 安装 Apache2+PHP5+MySQL
- Ubuntu图形界面环境下启动应该程序:
- 学霸是怎样炼成的(大一上篇)
- eclipse优化以及jvm内存的讲解与设置
- 串行口API的使用
- 数据结构实验之求二叉树后序遍历和层次遍历
- Android突破二之WindowManager、Display、DisplayMetrics类
- Diameter协议
- 如果当初学习编程时能有人给我这些忠告该多好
- oracle中to_char后查询当天在今年的第几周ww和iw的区别
- 15个你可能不知道的开源云平台
- Unity3d TweenPosition.Begin()的使用浅析
- ios Asynsocket 接收数据委托函数不执行