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

VC 多线程同步方式操作串口#include#includeusingnamespacestd;DWORDWINAPICommReceive(LPVOIDlpParameter);DWORDWINAPICommSend(LPVOIDlpParameter);HANDLEhwbEvent;HANDLEm_hCom;intmain(){ DCBdcb; //打开串口 m_hCom=C

#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;
};

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/36778.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注