⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 说明.txt

📁 vc实现的一个串口通讯例子
💻 TXT
字号:
函数说明:
	InitCom是打开串口并进行初始化,在对串口进行其他操作前必须执行它(本例子在
OnInitDialog中调用它)。
InitCom的参数1是串口号,参数2表示波特率,例如:InitCom(1,CBR_9600)表示用COM1,9600波特率

	ReadData是对串口进行读操作

	WriteData是对串口进行写操作
	WriteData的参数1是要发送的数据的指针,参数2是要发送的数据的长度。


这是串口编程的三个基本函数,具体什么时候调用ReadData,什么时候调用WriteData,由你自己决定,可以在ReadData中对所读的数据进行分析。

在本例子中采用定时放式,每隔100毫秒对串口进行一次操作。


记得程序退出前要关闭串口。





/////////////////////////////////////////////////////////////
//打开并初始化串口
//参数com为串口号,baud为波特率。
BOOL CComRhDlg::InitCom(int com, DWORD baud)
{
	COMMTIMEOUTS   timeout;
	DCB dcb;
	BOOL result;
	int temp=0;
	char strCom[20] = "\\\\.\\com";
	char buffer[20];
	
	_itoa(com , buffer , 10);
	strcat( strCom , buffer );
	
	m_hCom = CreateFile(strCom, GENERIC_READ | GENERIC_WRITE,
		0, NULL, OPEN_EXISTING, NULL , NULL);
	if( m_hCom == INVALID_HANDLE_VALUE ) 
	{
		DWORD dwError = GetLastError();
		
		if (dwError == ERROR_ACCESS_DENIED)//已经打开
		{
			AfxMessageBox( "端口已被占用!请退出程序" , MB_OK , 0 );				
			return FALSE;
		}
		
		AfxMessageBox( "端口不存在或已坏!请退出程序" , MB_OK , 0 );
		
		return FALSE;
	}
	
	result=SetupComm( m_hCom , 512 , 512 );
	ASSERT(result);
	if(!result) return FALSE;
	
	result = PurgeComm( m_hCom , PURGE_TXCLEAR|PURGE_RXCLEAR );
	ASSERT( result );
	if( !result ) return FALSE;
	
	result = GetCommState( m_hCom , &dcb );
	ASSERT(result);
	if(!result) return FALSE;
	
	dcb.Parity = NOPARITY;
	dcb.BaudRate = baud;
	dcb.StopBits = ONESTOPBIT;
	dcb.ByteSize = 8;
	
	result = SetCommState( m_hCom , &dcb );
	ASSERT(result);
	if(!result) return FALSE;
	
	result=GetCommTimeouts( m_hCom ,  &timeout );
	ASSERT(result);
	
	if(!result) return FALSE;
	
	timeout.ReadIntervalTimeout=MAXDWORD;
	timeout.ReadTotalTimeoutMultiplier=0;
	timeout.ReadTotalTimeoutConstant=0;
	
	timeout.WriteTotalTimeoutMultiplier=0;
	timeout.WriteTotalTimeoutConstant=0;
	
	result=SetCommTimeouts( m_hCom , &timeout );
	ASSERT(result);
	if(!result) return FALSE;
	
	return TRUE;
}


//////////////////////////////////////////////
//读取串口数据,并判断所读的数据
//然后调用WriteData函数,将数据发送到串口。
void CComRhDlg::ReadData()
{

	if(m_hCom == INVALID_HANDLE_VALUE)
		return;
	DWORD nRead = 0;

	BYTE	recBuf[512];//接收数据缓冲区
	memset(recBuf, 0, sizeof(recBuf));

	BYTE	sendBuf[512];//发送数据缓冲区
	memset(sendBuf, 0, sizeof(sendBuf));

	PurgeComm( m_hCom , PURGE_TXCLEAR|PURGE_RXCLEAR );

	ReadFile( m_hCom , (char *)recBuf , 512 ,&nRead , NULL);//读串口

	if(nRead != 0)
	{
///////////////////////////////////////////////////////////
//下面是对收到的数据进行分析,然后确定发送的内容
//发送内容放到sendBuf中,
		if(recBuf[0] == 0x06)
		{
			sendBuf[0] = 0x15;
			WriteData((char *)sendBuf, 1);
		}
//		else if( (recBuf[0] == 0x53)
//					&& (recBuf[1] = 0x55)
//						.... )
//		{
//			....
//			....
//		}
///////////////////////////////////////////////////////////
			
	}
}

/////////////////////////////////////////////////////////////
//串口写操作
//将长度为len的tmpStr发到串口上。
void CComRhDlg::WriteData(char *tmpStr, int len)
{
	if(m_hCom == INVALID_HANDLE_VALUE)
		return;

	DWORD nWrite = 0;

	PurgeComm( m_hCom , PURGE_TXCLEAR|PURGE_RXCLEAR );
	Sleep(100);

	WriteFile(m_hCom, tmpStr, len , &nWrite, NULL);//写串口

	if(nWrite != len)
	{
		AfxMessageBox("写数据失败!");
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -