浅谈VC编写Modbus模拟通讯设备

本文记录了使用VC编写Modbus模拟通讯设备的过程,详细介绍了如何重写Cserialport类的writetoport函数,并利用定时器处理Modbus指令接收。文章还提及了Str2Hex和HexChar函数的实现,以及消息映射在其中的作用。
摘要由CSDN通过智能技术生成
 

最近有编写一个Modbus模拟通讯设备,这里记下编写过程中遇到的问题,聊作学习笔记。

编写程序中有用到的两个类:

CAniGIF m_ctrlAniGifFan1;
CSerialPort m_Port;


过程中重写了Cserialport类的writetoport函数

void CSerialPort::WriteToPort(char* string,int n)
{		
	assert(m_hComm != 0);

	memset(m_szWriteBuffer, 0, sizeof(m_szWriteBuffer));
//	memset(m_szWriteBuffer, 0, n);
//	strncpy(m_szWriteBuffer, string, n);
	memcpy(m_szWriteBuffer, string, n);
	m_nWriteSize=n;

	// set event for write
	SetEvent(m_hWriteEvent);
}

通过定时5ms来判定接收完一条modbus指令:

  LONG Dialog1::OnCommunication(WPARAM ch, LPARAM port)
{
	if (m_bTimer==TRUE)//有了m_bTimer,一条modbus指令中只会一次定时5ms
	{//m_bTimer要初始化为true
		SetTimer(1,5,NULL);//5毫秒
		m_bTimer=FALSE;
	}
	CString str;
	str.Format("%02x ",ch);
	m_strPortRXData+=str;
	
	return 0;
}

void Dialog1::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if (nIDEvent==1)
	{
		char data[512];
		BYTE rxdata[512];
		CString str,strTemp;
		unsigned short c1,c2;
		int len=Str2Hex(m_strPortRXData,data);
		for (LONG k=0;k<len;k++)
		{
			rxdata[k]=data[k];
		}
		c1=CRC16(rxdata,len-2);
		c2=rxdata[len-1]|(rxdata[len-2]<<8);
		if (c1=c2)
		{
			if (rxdata[0]==0x01)
			{
				switch(rxdata[1])
				{
				case 0x10:
					{
						switch(rxdata[8])
						{
						case 0x05:
							{
								//alloff
								Even(FALSE);
								Odd(FALSE);
							}break;
						case 0x06:
							{
								Even(FALSE);
						
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值