VC 多线程同步方式操作串口

来源:互联网 发布:php中美元符号 编辑:程序博客网 时间:2024/05/21 09:01
#include<windows.h>#include<iostream>using namespace std;DWORD WINAPI CommReceive(LPVOID lpParameter);DWORD WINAPI CommSend(LPVOID lpParameter);HANDLE m_hCom;int main(){DCB dcb;//打开串口m_hCom=CreateFile("COM9",//端口号GENERIC_READ|GENERIC_WRITE, //权限可读写0,NULL,OPEN_EXISTING,//打开存在的端口NULL,//以同步方式打开NULL);//设置串口参数GetCommState(m_hCom, &dcb);dcb.BaudRate=115200;//波特率dcb.Parity=false;//无奇偶校验位dcb.StopBits=0;//1位停止位dcb.ByteSize=8;//数据宽度为8if(!SetCommState(m_hCom, &dcb)){printf("error=%d\n",GetLastError());}//设置缓冲区大小SetupComm(m_hCom,1024,1024);//清空发送缓冲区和接受缓冲区PurgeComm(m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);//超时设置COMMTIMEOUTS TimeOuts;  //设定读超时  TimeOuts.ReadIntervalTimeout=0;  TimeOuts.ReadTotalTimeoutMultiplier=0;  TimeOuts.ReadTotalTimeoutConstant=2500;  //设定写超时  TimeOuts.WriteTotalTimeoutMultiplier=0;  TimeOuts.WriteTotalTimeoutConstant=2500;  //新建接受线程HANDLE rThread=CreateThread(NULL,0,CommReceive,NULL,0,NULL);    CloseHandle(rThread);//关闭打开的线程句柄//新建发送线程HANDLE sThread=CreateThread(NULL,0,CommSend,NULL,0,NULL);    CloseHandle(sThread);//关闭打开的线程句柄while(1){;}//关闭串口CloseHandle(m_hCom);return 0;}DWORD WINAPI CommSend(LPVOID lpParameter){DWORD dwBytesWrite;char CommandStr[]="hello\n";while(1){//写数据DWORD WriteFlag=WriteFile(m_hCom,(void *)CommandStr,strlen(CommandStr),&dwBytesWrite,NULL);if(!WriteFlag){cout<<"write error"<<endl;}//清空发送缓冲区PurgeComm(m_hCom,PURGE_TXCLEAR);//每5秒钟,重复发送一次数据Sleep(5000);}return 0;};DWORD WINAPI CommReceive(LPVOID lpParameter){char str[1024];DWORD dwBytesRead;DWORD dwErrorFlags;COMSTAT ComStat;memset(str,0,1024);while(1){//获取错误信息以及了解缓冲区相应的状态ClearCommError(m_hCom,&dwErrorFlags,&ComStat);//判断接受缓冲区是否为空if(ComStat.cbInQue!=0){//如果接受缓冲区状态信息不为空,则把接受信息打印出来DWORD ReadFlag=ReadFile(m_hCom,&str[0],ComStat.cbInQue,&dwBytesRead,NULL);if(!ReadFlag){cout<<"read error"<<endl;}cout<<str;memset(str,0,ComStat.cbInQue);}//清空接受缓冲区PurgeComm(m_hCom,PURGE_TXCLEAR);}    return 0;};

原创粉丝点击