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

📄 simsimensdoc.cpp

📁 用VC做的串口程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:

	//重新设置设备参数,读、写缓冲区大小均为MAXBLOCK
	SetupComm(m_hCom,MAXBLOCK,MAXBLOCK);

	//设置监视事件EV_RXCHAR,该事件表示接收倒任何字符并放进接收缓冲区中
	SetCommMask(m_hCom,EV_RXCHAR);

	//把间隔超时设为最大,把读总超时设为0将导致ReadFile立即返回并完成操作
	TimeOuts.ReadIntervalTimeout=5;
	TimeOuts.ReadTotalTimeoutMultiplier=5;
	TimeOuts.ReadTotalTimeoutConstant=0;
	//设置写超时以指定Write成员函数中的GetOverlappedResult函数的等待时间
	TimeOuts.WriteTotalTimeoutMultiplier=5;
	TimeOuts.WriteTotalTimeoutConstant=20;
	SetCommTimeouts(m_hCom,&TimeOuts);
	
	//如果成功设置串口,启动监视串口线程,线程控制函数为CommProc,
	//并将当前指针this作为参数传递给CommProc函数
	if(ConfigConnection())
	{
		//创汇建并挂起监视线程
		m_pThread=AfxBeginThread(CommProc,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL);
        
		//恢复监视线程运行
		if(m_pThread==NULL)
		{
			CloseHandle(m_hCom);
			return FALSE;
		}
		else 
		{
			m_bConnected=TRUE;
			m_pThread->ResumeThread();
		}

	}
	else
	{
		CloseHandle(m_hCom);
		return FALSE;
	}
	return TRUE;
}

void CSimSimensDoc::CloseConnection()        //关闭串口设备
{
	//如果已被挂断,返回;否则置m_dConnected为FALSE
	if(!m_bConnected)
		return;
	else
		m_bConnected=FALSE;

	//结束CommProc线程中WaitForSingleObject的等待
	SetEvent(m_hPostMsgEvent);

	//结束CommProc线程中WaitCommEvent的等待
	SetCommMask(m_hCom,0);

	//等待辅助线程终止
	WaitForSingleObject(m_pThread->m_hThread,INFINITE);
	m_pThread=NULL;

	//关闭串口设备句柄
	CloseHandle(m_hCom);
	return;
}

void CSimSimensDoc::Transmit() 
{
	// TODO: Add your command handler code here
	SetTempStr();
	bcc=GetBCC(transmit_str);
	bcc=bcc^char(DLE);
	bcc=bcc^char(ETX);
    m_nStatus=1;
	m_nWriteStep=0;             
	transmit_number=0;
	Write(char(STX));
	Show_T_STX();
        //写串口开始请求
	if(rt_STX_number>TXA)
	{
		Show_TXA_OVER_STX();
		EmptyTempStr();
		LargeReturnIdle();
		LinkError();
	}
	else
	{
		if(OutTime(QVZ))
		{
			Show_QVZ_OUTTIME();
	        rt_STX_number++;
		    Transmit();
		}
	}
	return;
}

void CSimSimensDoc::GetTextBegin(CString str)
{
	int l=0;
	if(str!="")
	{
		transmit_str[transmit_number]=m_cTextMode;
	    transmit_number++;
        l=str.GetLength();
	    for(int i=0;i<l;i++)
		{
			transmit_str[transmit_number]=str.GetAt(i);
			transmit_number++;
		}
	}
	else
	{
		transmit_str[transmit_number]=m_cTextMode;
		transmit_number++;
	}
	return;
}

void CSimSimensDoc::GetText(CString str)
{
	int l=0;
	if(str!="")
	{
		transmit_str[transmit_number]=':';
	    transmit_number++;
        l=str.GetLength();
	    for(int i=0;i<l;i++)
		{
			transmit_str[transmit_number]=str.GetAt(i);
			transmit_number++;
		}
	}
	return;
}

void CSimSimensDoc::SetText()
{
	receive_number=0;
	m_cTextMode=receive_str[receive_number];
	receive_number++;
	AntiRectifyText();
	bool b=false;
	b=SetData(m_sD1);
	if(b)
		b=SetData(m_sD2);
	else
		return;
	if(b)
		b=SetData(m_sD3);
	else
		return;
	if(b)
		b=SetData(m_sD4);
	else
		return;
	if(b)
		b=SetData(m_sD5);
	else
		return;
}

bool CSimSimensDoc::SetData(CString &str)
{
	do
	{
		if(receive_str[receive_number]==':')
		{
			receive_number++;
		    if(receive_str[receive_number]==char('DLE'))
			{
				receive_number++;
				if(receive_str[receive_number]==char('ETX'))
				{
					EmptyRString();
					return false;
				}
				else
				{
					receive_number-=1;
				    return true;
				}
			}
			else
			{
				return true;
			}
		}
		else 
		{
			if(receive_str[receive_number]==char(DLE))
			{
				receive_number++;
				if(receive_str[receive_number]==char(ETX))
				return false;
				else
				{
					str+=char(DLE);
					receive_number++;
				}
			}
			else
			{
				str+=receive_str[receive_number];
			    receive_number++;
			}
		}
	}while(true);
}

void CSimSimensDoc::Rectify()
{
	switch(m_nBaud)                 //校正波特率
	{
	case 0:
		m_nBaud=300;
		break;
	case 1:
		m_nBaud=600;
		break;
	case 2:
		m_nBaud=1200;
		break;
	case 3:
		m_nBaud=2400;
		break;	
	case 4:
		m_nBaud=9600;
		break;
	case 5:
		m_nBaud=14400;
		break;
	case 6:
		m_nBaud=19200;
		break;
	case 7:
		m_nBaud=38400;
		break;
	case 8:
		m_nBaud=57600;
		break;
	default:;
	}

	m_nDataBits=m_nDataBits+5;      //校正数据位
	
	switch(m_nPort)                 //校正端口名
	{
	case 0:
		m_sPort="COM1";
		break;
	case 1:
		m_sPort="COM2";
		break;
	case 2:
		m_sPort="COM3";
		break;
	case 3:
		m_sPort="COM4";
		break;
	default:;
	}
	return;
}

void CSimSimensDoc::AntiRectify()
{
	switch(m_nBaud/100)            //反校正波特率
	{
	case 3:
		m_nBaud=0;
		break;
	case 6:
		m_nBaud=1;
		break;
	case 12:
		m_nBaud=2;
		break;
	case 24:
		m_nBaud=3;
		break;	
	case 96:
		m_nBaud=4;
		break;
	case 144:
		m_nBaud=5;
		break;
	case 192:
		m_nBaud=6;
		break;
	case 384:
		m_nBaud=7;
		break;
	case 576:
		m_nBaud=8;
		break;
	default:;
	}

	m_nDataBits=m_nDataBits-5;         //反校正数据位
	return;
}

void CSimSimensDoc::RectifyText()
{
	switch(m_nTextMode)            //校正消息类型
	{
	case 0:
		m_cTextMode='N';
		break;
	case 1:
		m_cTextMode='M';
		break;
	case 2:
		m_cTextMode='E';
		break;
	case 3:
		m_cTextMode='P';
		break;
	case 4:
		m_cTextMode='R';
		break;
	case 5:
		m_cTextMode='D';
		break;
	case 6:
		m_cTextMode='T';
		break;
	default:;
	}
	return;
}

void CSimSimensDoc::AntiRectifyText()
{
	switch(m_cTextMode)            //反校正消息类型
	{
	case 'N':
		m_nTextMode=0;
		break;
	case 'M':
		m_nTextMode=1;
		break;
	case 'E':
		m_nTextMode=2;
		break;
	case 'P':
		m_nTextMode=3;
		break;
	case 'R':
		m_nTextMode=4;
		break;
	case 'D':
		m_nTextMode=5;
		break;
	case 'T':
		m_nTextMode=6;
		break;
	default:;
	}
	return;
}

void CSimSimensDoc::EmptyTString()
{
	for(int i=0;i<MAXBLOCK/4;i++)
	{
		transmit_str[i]=0;
	}
	transmit_number=0;
	return;
}

void CSimSimensDoc::EmptyRString()
{
	for(int i=0;i<MAXBLOCK/4;i++)
	{
		receive_str[i]=0;
	}
	receive_number=0;
	return;
}

void CSimSimensDoc::SetTempStr()
{
	for(int i=0;i<MAXBLOCK/4;i++)
	{
		temp_str[i]=transmit_str[i];
	}
	return;
}

void CSimSimensDoc::EmptyTempStr()
{
	for(int i=0;i<MAXBLOCK/4;i++)
	{
		temp_str[i]=0;
	}
	return;
}

void CSimSimensDoc::SetTString()
{
	for(int i=0;i<MAXBLOCK/4;i++)
	{
		transmit_str[i]=temp_str[i];
	}
	return;
}

void CSimSimensDoc::LinkError()
{
	AfxMessageBox("A link failure!");
	return;
}

bool CSimSimensDoc::OutTime(DWORD times)
{ 
	COMSTAT ComStat;
	DWORD dwErrorFlags;
	for(int i=0;i<int(times/10);i++)
	{
		::Sleep(10);
		ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
        if(ComStat.cbInQue)
		{
		    return false;
		}
	}   
	return true;
}

bool CSimSimensDoc::TextEnd(char string[MAXBLOCK/4])
{ 
	for(int i=0;i<MAXBLOCK/4;i++)
	{
		if(string[i]!=NULL)
			return false;
	}
	return true;
}

char CSimSimensDoc::GetBCC(char string[MAXBLOCK/4])
{   
	char c=NULL;
	for(int i=0;i<MAXBLOCK/4;i++)
		c=c^string[i];
    return c;	
}

bool CSimSimensDoc::CheckBCC(char c)
{
	char check=NULL;
	check=GetBCC(receive_str);
	if(c==check)
		return true;
	else
		return false;
}

void CSimSimensDoc::SmallReturnIdle()
{
	m_nStatus=0;
	m_nReadStep=0;
	m_nWriteStep=0;
	rt_STX_number=0;
    EmptyTString();
	no_error=true;
	return;
}

void CSimSimensDoc::LargeReturnIdle()
{
	m_nStatus=0;
	m_nReadStep=0;
	m_nWriteStep=0;
	rt_STX_number=0;
	rt_number=0;
	rr_number=0;
    EmptyTString();
	no_error=true;
	return;
}

void CSimSimensDoc::ReplaceData(CString string)
{
	int length=string.GetLength();
	if(length&1)
	{
		string+=':';
		length++;
	}
	for(int i=0;i<length;i++)
		transmit_str[i]=string.GetAt(i);
	Transmit();
	return;
}

char CSimSimensDoc::Read()
{
	char c=NULL;
	char * buf=&c;   
	DWORD Length=1;
	COMSTAT ComStat;
	DWORD dwErrorFlags;

	//清除错误标志并返回设备当前状态信息
	ClearCommError(m_hCom,&dwErrorFlags,&ComStat);

	//读操作
	ReadFile(m_hCom,buf,Length,&Length,&m_osRead);
	return c;
}

DWORD CSimSimensDoc::Write(char c)
{
//	::Sleep(10);
	DWORD Length=1;
	char * buf=&c;
	BOOL fState;
	COMSTAT ComStat;
	DWORD dwErrorFlags;

    //清除错误标志并返回设备当前状态信息
	ClearCommError(m_hCom,&dwErrorFlags,&ComStat);

	//写操作
	
	fState=WriteFile(m_hCom,buf,Length,&Length,&m_osWrite);

	if(!fState)
	{
		//如果写操作还未完成,继续等待
		if(GetLastError()==ERROR_IO_PENDING)
			GetOverlappedResult(m_hCom,&m_osWrite,&Length,TRUE);
		else
			Length=0;
	}
	return Length;
}

 void CSimSimensDoc::WriteText()
{
	while(!TextEnd(transmit_str))
	{
		tc=transmit_str[transmit_number];
		if(tc==char(DLE))
		{
			transmit_str[transmit_number]=NULL;
		    Write(char(DLE));
			Write(char(DLE));
		    transmit_number++;
			Check();
		}
		else
		{
			transmit_str[transmit_number]=NULL;
			Write(tc);
		    transmit_number++;
			Check();
		}
	}
	transmit_number=0;
	Write(char(DLE));
	Check(); 
	Write(char(ETX));
	Check();
	Write(bcc);
	Show_T_DLEETXBCC();
	if(OutTime(QVZ))
	{
		Show_QVZ_OUTTIME();
		Show_T_TEXT_UNSUCCESS();
		ReTransmit();
	}
	return;
}

void CSimSimensDoc::Check()
{
	COMSTAT ComStat;
	DWORD dwErrorFlags;
	char c=NULL;
    ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
    if(ComStat.cbInQue)
	{
		c=Read();
		if(c!=NULL)
		{
			if(c==char(NAK))
			Show_R_NAK();
			else
			{
				Show_R_OTHER();
				::Sleep(ZVZ);
				Write(char(NAK));
			    Show_T_NAK();
			}
			ReTransmit();
		}
	}
	return;
}

void CSimSimensDoc::ReTransmit()

⌨️ 快捷键说明

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