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

        直接贴出串口异步方式多线程操作代码,有注释,至于函数的更详细的功能,可以百度一下。

#include<windows.h>
#include<iostream>
#include <iomanip>
using namespace std;
DWORD WINAPI CommSend(LPVOID lpParameter); 
DWORD WINAPI CommReceive(LPVOID lpParameter); 
OVERLAPPED overRead,overWrite; 
HANDLE m_hCom;
int main()
{
	//打开串口
	m_hCom=CreateFile("COM9",                      //文件名
						GENERIC_READ|GENERIC_WRITE,//读写模式
						0,						   //独占模式
						NULL,					   //安全属性
						OPEN_EXISTING,			   //创建文件的属性
						FILE_ATTRIBUTE_NORMAL| FILE_FLAG_OVERLAPPED, //异步方式打开
						NULL);
	if(m_hCom==INVALID_HANDLE_VALUE)
	{
		cout<<"comm create error!"<<endl;
		return 0;
	}
	//配置串口
	DCB dcb;
	GetCommState(m_hCom,&dcb);
	dcb.BaudRate = 115200;			// Current baud
	dcb.fBinary = TRUE;				// Binary mode; no EOF check
	dcb.fParity = TRUE;				// Enable parity checking
	dcb.fOutxCtsFlow = FALSE;		// No CTS output flow control
	dcb.fOutxDsrFlow = FALSE;		// No DSR output flow control
	dcb.fDtrControl = DTR_CONTROL_ENABLE; // DTR flow control type
	dcb.fDsrSensitivity = FALSE;	// DSR sensitivity
	dcb.fTXContinueOnXoff = TRUE;	// XOFF continues Tx
	dcb.fOutX = FALSE;				// No XON/XOFF out flow control
	dcb.fInX = FALSE;				// No XON/XOFF in flow control
	dcb.fErrorChar = FALSE;			// Disable error replacement
	dcb.fNull = FALSE;				// Disable null stripping
	dcb.fRtsControl = RTS_CONTROL_ENABLE; // RTS flow control
	dcb.fAbortOnError = FALSE;		// Do not abort reads/writes on // error
	dcb.ByteSize = 8;				// Number of bits/byte, 4-8
	dcb.Parity = NOPARITY;			// 0-4=no,odd,even,mark,space
	dcb.StopBits = ONESTOPBIT;		// 0,1,2 = 1, 1.5, 2 /
	if(!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=100;  
	TimeOuts.ReadTotalTimeoutMultiplier=0;  
	TimeOuts.ReadTotalTimeoutConstant=0;  
	//设定写超时  
	TimeOuts.WriteTotalTimeoutMultiplier=0;  
	TimeOuts.WriteTotalTimeoutConstant=0;  
	SetCommTimeouts(m_hCom,&TimeOuts); 
	//创建读事件
	memset(&overRead,0,sizeof(OVERLAPPED)); 
	overRead.hEvent=CreateEvent(NULL,true,false,NULL); 
	//创建写事件
	memset(&overWrite,0,sizeof(OVERLAPPED)); 
	overWrite.hEvent=CreateEvent(NULL,true,false,NULL); 
	//创建收线程
	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;
	DWORD WriteFlag;
	DWORD numWrite;
	DWORD sr;
	char CommandStr[]="AT+CSQ\r";
	while(1)
	{
		//写数据
		WriteFlag=WriteFile(m_hCom,CommandStr,strlen(CommandStr),&dwBytesWrite,&overWrite);
		if(!WriteFlag)
		{
			if(GetLastError()==ERROR_IO_PENDING)
			{ 
				sr = GetOverlappedResult(m_hCom,&overWrite,&numWrite,true);
				cout<<"numWrite="<<numWrite<<endl;
				PurgeComm(m_hCom,PURGE_TXABORT | PURGE_TXCLEAR);
			}
		}
		Sleep(1000);
	}//end of while
	return 0;
};

DWORD WINAPI CommReceive(LPVOID lpParameter)  
{  
	char str[1024];
	DWORD dwBytesRead;
	DWORD readFlag;
	DWORD numRead;
	DWORD rr ;
	memset(str,0,1024);
	while(1)
	{
		//读数据
		readFlag=ReadFile(m_hCom,str,128,&dwBytesRead,&overRead);  
		if(!readFlag)
		{
			if(GetLastError()==ERROR_IO_PENDING)
			{ 
				rr = GetOverlappedResult(m_hCom,&overRead,&numRead,true);
				cout<<"numRead="<<numRead<<endl;
				cout<<str;
				PurgeComm(m_hCom, PURGE_RXABORT | PURGE_RXCLEAR);
				memset(str,0,numRead);
			}
		}//end of if
	}//end of while
	return 0;
};  


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值