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

#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;									//数据宽度为8
	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=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;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值