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

📄 wirecomm485.c

📁 原创的msp430单片机的整套编码 包括通信,红外检测,软件计时等多种功能
💻 C
📖 第 1 页 / 共 2 页
字号:
			TqueueRS485[0] = *headRS485;// 构造发送队列
			TqueueRS485[1] = 0x03;
			TqueueRS485[2] = SOEBYTEnum * 8 + 4;//发送的数据字节数 = 发送记录的条数 * 8 + 4
			TqueueRS485[3] = *(RS485voffset(3));
			TqueueRS485[4] = *(RS485voffset(4)); 
			TqueueRS485[5] = *(RS485voffset(5));
			TqueueRS485[6] = *(RS485voffset(6)); 
			for (i=0 ;i<SOEBYTEnum;i++)
			{
				TqueueRS485[7+8*i] = FM_byte_read(SOEPosition_send);
				TqueueRS485[8+8*i] = FM_byte_read(SOEPosition_send+1);
				TqueueRS485[9+8*i] = FM_byte_read(SOEPosition_send+2);
				TqueueRS485[10+8*i] = FM_byte_read(SOEPosition_send+3);
				TqueueRS485[11+8*i] = FM_byte_read(SOEPosition_send+4);
				TqueueRS485[12+8*i] = FM_byte_read(SOEPosition_send+5);
				TqueueRS485[13+8*i] = FM_byte_read(SOEPosition_send+6);
				TqueueRS485[14+8*i] = FM_byte_read(SOEPosition_send+7);
				SOEPosition_send = SOEPosition_send + 8;//记录指针指向FRAM中的下一条记录
				if (SOEPosition_send > 0x7FF8)//边界判断
					SOEPosition_send = SOE_REC_BASE;
			}
			tlengthRS485 = 5 + SOEBYTEnum * 8 + 4; //队列长度 = 5 + 发送的数据字节数
			
			crccalculate = RS485crc_count(TqueueRS485, tlengthRS485 - 2, 0);
			TqueueRS485[tlengthRS485 - 1] = (unsigned char)crccalculate;
			TqueueRS485[tlengthRS485 - 2] = (unsigned char)(crccalculate >> 8);
			RS485Send_Tqueue(9);  //发送数据,接收队列的头指针后移9位,表示已处理完对该帧的应答
			
		}
		
		return;
	
					
}// end of RS485operate03()

///////////////////////////////////////////////////////////////////////////
//name:		RS485operate123()
//function: 功能代码为0x7B时的处理函数
//parameter:unsigned char *CommType,通信类型(RS485)
//return:	none
///////////////////////////////////////////////////////////////////////////
void RS485operate123(void)
{
	unsigned int crccalculate;
  if (RS485crc_check(headRS485, headRS485 + 5, 1) == 0)  //如果是后续查询帧
		{
			RS485MoveHead(1);
			return;
		}
		
	

	if (!MotorRunEnable)
		{
			OnSaleRow = *RS485voffset(3);
			OnSaleCol = *RS485voffset(4);
			MotorRunEnable = ON;
		}

	   			
		TqueueRS485[0] = *headRS485;// 构造发送队列
		TqueueRS485[1] = 0x7B;
		TqueueRS485[2] = 0;  
		tlengthRS485 = 5;
					
		crccalculate = RS485crc_count(TqueueRS485, tlengthRS485 - 2, 0);
		TqueueRS485[tlengthRS485 - 1] = (unsigned char)crccalculate;
		TqueueRS485[tlengthRS485 - 2] = (unsigned char)(crccalculate >> 8);

	  RS485Send_Tqueue(7);  //发送数据,接收队列的头指针后移7位,表示已处理完对该帧的应答
		return;
	
					
}// end of RS485operate123()


///////////////////////////////////////////////////////////////////////////
//name:RS485operate125()
//function: 125功能码实现计数板当前程序版本查询命令
//parameter:unsigned char *CommType,通信类型(RS485或者CAN)
//return:	none
//update:	2006-11-23 szb 程序版本格式示例为:“CNT1010V1.0”,加上最后的中止字符共12个字符长度
///////////////////////////////////////////////////////////////////////////
void RS485operate125(void)
{
	unsigned int crccalculate;
	unsigned char i;
	char ver[12] = VERSION;
	
	if(!RS485crc_check(headRS485, headRS485 + 3, 1))// CRC校验错误,该帧长度5字节
					{
			 			RS485MoveHead(1);
			 			return;
					}
					
	TqueueRS485[0] = *headRS485;// 构造发送队列
	TqueueRS485[1] = 0x7D;
	TqueueRS485[2] = 12;//数据量
	for (i=0;i<12;i++)
	  TqueueRS485[i+3] = ver[i]; 
	tlengthRS485 = 17;
					
  crccalculate = RS485crc_count(TqueueRS485, tlengthRS485 - 2, 0);
        
	TqueueRS485[tlengthRS485 - 1] = (unsigned char)crccalculate;
	TqueueRS485[tlengthRS485 - 2] = (unsigned char)(crccalculate >> 8);
					    
	RS485Send_Tqueue(5);  //发送数据,接收队列的头指针后移5位,表示已处理完对该帧的应答
	
	return;
}// end of RS485operate125()


///////////////////////////////////////////////////////////////////////////
//name:RS485operate126()
//function: 126功能码实现计数板时间查询命令
//parameter:unsigned char *CommType,通信类型(RS485或者CAN)
//return:	none
//update:	2006-03-20 szb 时间顺序为年,月,日,小时,分,秒
///////////////////////////////////////////////////////////////////////////
void RS485operate126(void)
{
	unsigned int crccalculate;
	if(!RS485crc_check(headRS485, headRS485 + 3, 1))// CRC校验错误,该帧长度5字节
					{
			 			RS485MoveHead(1);
			 			return;
					}
	
	TqueueRS485[0] = *headRS485;// 构造发送队列
	TqueueRS485[1] = 0x7E;
	TqueueRS485[2] = 6;//数据量  
	TqueueRS485[3] = Clocktime[0];//年
	TqueueRS485[4] = Clocktime[1];//月
	TqueueRS485[5] = Clocktime[2];//日
	TqueueRS485[6] = Clocktime[3];//时
	TqueueRS485[7] = Clocktime[4];//分
	TqueueRS485[8] = Clocktime[5];//秒
	tlengthRS485 = 11;
					
  crccalculate = RS485crc_count(TqueueRS485, tlengthRS485 - 2, 0);
        
	TqueueRS485[tlengthRS485 - 1] = (unsigned char)crccalculate;
	TqueueRS485[tlengthRS485 - 2] = (unsigned char)(crccalculate >> 8);
					    
	RS485Send_Tqueue(5);  //发送数据,接收队列的头指针后移5位,表示已处理完对该帧的应答
	
	return;
}// end of RS485operate126()



///////////////////////////////////////////////////////////////////////////
//name:RS485operate127()
//function: 127功能码实现,校时命令
//parameter:unsigned char *CommType,通信类型(RS485或者CAN)
//return:	none
//update:	2006-03-20 szb 时间顺序为年,月,日,小时,分,秒
///////////////////////////////////////////////////////////////////////////
void RS485operate127(void)
{
	unsigned char j;
	//unsigned char dataamount;
	//dataamount = *RS485voffset(2);// 数据数量6
	
	// 数据数量错误
	//if(dataamount != 6)
	//{
		//RS485MoveHead(1);
		//return;
	//}
	if(!RS485crc_check(headRS485, headRS485 + 9, 1))// CRC校验错误,该帧长度11字节
					{
			 			RS485MoveHead(1);
			 			return;
					}
	 _DINT(); //校时过程中关闭中断
	for (j = 0;j < 6;j++)
		Clocktime[j] = *RS485voffset(j + 3);  //ClockTemp[j]规定为unsigned char类型
	_EINT();	
	RS485MoveHead(11);     //头指针后移一个帧长度(11字节)
	
	return;
}// end of RS485operate127()


///////////////////////////////////////////////////////////////////////////
//name:COMM485()
//function:RS485通信主函数
//parameter:通信类型RS485
//return:none
///////////////////////////////////////////////////////////////////////////
void COMM485(void)
{
	unsigned char FuncCode;//功能码
		while (headRS485 > tailRS485 && headRS485 - tailRS485 <= RqueueRS485_Length - 5 || tailRS485 - headRS485 >= 5)
					{
						if(*headRS485 == SlaveAddress || *headRS485 == 255)// 从站地址为本站地址或广播地址
						{
							if (headRS485 - origRS485 == RqueueRS485_Length - 1)
								FuncCode = *origRS485;// FuncCode即为原来的*(headRS485+1)
							else
								FuncCode = *(headRS485 + 1);
							switch (FuncCode)
							{
								case 0x03:  //if (((tailRS485 - headRS485 < 9) && (tailRS485 > headRS485)) || (headRS485 - tailRS485 > RqueueRS485_Length - 9)) break;
											//else RS485operate03();
											if (headRS485 > tailRS485 && headRS485 - tailRS485 <= RqueueRS485_Length - 9 || tailRS485 - headRS485 >= 9)
												RS485operate03();
											break;
								case 0x7B:
									    if (headRS485 > tailRS485 && headRS485 - tailRS485 <= RqueueRS485_Length - 7 || tailRS485 - headRS485 >= 7)
									    	RS485operate123();
									    break;
								case 0x7D:  
											RS485operate125();
											break;
								case 0x7E:  
											RS485operate126();
											break;
								case 0x7F:  //if(((tailRS485 - headRS485 < 11) && (tailRS485 > headRS485)) || (headRS485 - tailRS485 > RqueueRS485_Length - 11)) break;//waitflag = on;
											//else RS485operate127();
											if (headRS485 > tailRS485 && headRS485 - tailRS485 <= RqueueRS485_Length - 11 || tailRS485 - headRS485 >= 11)
												RS485operate127();
											break;
							
								default:	RS485MoveHead(1);// 处理头指针位置,舍弃刚才头指针指向的这一帧
											break;
							}
						}
						else RS485MoveHead(1);// 从站地址既不是广播地址,也不是本站地址的情况,处理头指针位置,head指向功能码
					
					}
//P3OUT &= ~BIT6;

	
}


///////////////////////////////////////////////////////////////////////////
//接收中断服务程序USART1
///////////////////////////////////////////////////////////////////////////
interrupt[UART0RX_VECTOR] void USART0_RX(void)
{
	_DINT();	
	*tailRS485 = RXBUF0;// 接收缓存的值赋给循环队列尾指针对应的位置
	toffsetRS485 = RS485offset(toffsetRS485, 1, RqueueRS485_Length);
	tailRS485 = origRS485 + toffsetRS485;// 完成尾指针加1的功能
		_EINT();

}

///////////////////////////////////////////////////////////////////////////
//发送中断服务程序(wjg, 2003.3.21修改)
///////////////////////////////////////////////////////////////////////////
interrupt[UART0TX_VECTOR] void USART0_TX(void)
{
	_DINT();
	if (++numberRS485 <tlengthRS485)
	{
		
		TXBUF0 = TqueueRS485[numberRS485];
		
	}
	else 
	{
		IE1 &= ~UTXIE0;
	}
	_EINT();
}

⌨️ 快捷键说明

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