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

📄 uart_cimr.c

📁 HX-87 GPS模块协议转换程序
💻 C
📖 第 1 页 / 共 2 页
字号:
									if(uart_number==8)
										comm_error=0;	
									else comm_error=1;//num  error
									if(write_mode==2)
										{
											if(mode==1)
												{
													send_buf[16]=r_buffer[1];
													send_buf[17]=r_buffer[2];
													send_buf[18]=r_buffer[3];
													send_buf[19]=r_buffer[5]*2;
													for(i=0;i<8;i++)
														{
															send_buf[20+i]=0;
														}
												}
											if(mode==2)
												{
													send_buf[4]=r_buffer[1];
													send_buf[5]=r_buffer[2];
													send_buf[6]=r_buffer[3];
													send_buf[7]=r_buffer[5]*2;
													send_buf[8]=0;
													send_buf[9]=0;
												}
										}
									write_mode=0;
									break;
								case FUN_TEST:
									if(uart_number==8)
										{
											comm_error=0;
										}
									else comm_error=1;//num  error
									break;
								case 0x83:	
								case 0x89:
								case 0x90:
									if(uart_number==5)
										{
											comm_error=0;
										}
									else comm_error=1;//num  error
									break;//异常时的响应
								default:
									comm_error=1;
									break;//function error
							}
					}
				else		//ADDR ERROR
					{
						comm_error=1;
					}
			}
		else		//CRC  ERROR
			{
				comm_error=1;
			}
		if(comm_error==0)
			{
				comm_flag=0;
				TR2=0;
				timer2_num=timer2_num1=timer2_num2=0;
				comm_enum=0;
				comm_cnum++;
				if(comm_cnum==3)
					{
						RUN_FLAG=!RUN_FLAG;
						comm_cnum=0;
					}
				ES=1;
				RI=0;
			}
		uart_number=0;
		uart_complete=0;
	}

void ctrl_single(void)
	{
		write_mode=1;
		s_buffer[0]=SLAVE_ADDR;
		s_buffer[1]=FUN_WRITE;
		s_buffer[2]=ctrl_mode_addr[2*j];
		s_buffer[3]=ctrl_mode_addr[2*j+1];
		s_buffer[4]=0;
		s_buffer[5]=1;	//寄存器个数
		s_buffer[6]=2;	//数据字节数
		temp_u.temp_s.temp_h=receive_cmp[2*j];
		temp_u.temp_s.temp_l=receive_cmp[2*j+1];
		if(j==0)
			{
				temp_u.temp_value=((temp_u.temp_value&0x0003)|((temp_u.temp_value&0x00fc)<<4)|((temp_u.temp_value&0x0300)>>6)|((temp_u.temp_value&0x3c00)<<2)|((temp_u.temp_value&0xc000)>>10));	
			}
		s_buffer[7]=temp_u.temp_s.temp_h;
		s_buffer[8]=temp_u.temp_s.temp_l;
		crc_n(9);
		s_buffer[9]=crc_c.crc_w.crc_l;
		s_buffer[10]=crc_c.crc_w.crc_h;
		frame_send(11);
		comm_len=11;
		ctrl_change[j]=0;
		comm_flag=1;
		RCAP2H=RCAP2H_VALUE;
		RCAP2L=RCAP2L_VALUE;
		TR2=1;	
	}

void ctrl_mult(void)
	{
		for(j=0;j<8;j++)
			{
				if((ctrl_change[j]==1)&&(comm_flag==0))	//控制从机运行
					{
						ctrl_single();
					}
			}
	}

void read_state(unsigned char m)
	{
		read_mode=1;
		s_buffer[0]=SLAVE_ADDR;
		s_buffer[1]=FUN_READ;
		if((m==0)||(m==2))
			{
				s_buffer[2]=read_mode02_addr[2*rstate_num];
				s_buffer[3]=read_mode02_addr[2*rstate_num+1];
			}
		if(m==1)
			{
				s_buffer[2]=read_mode1_addr[2*rstate_num];
				s_buffer[3]=read_mode1_addr[2*rstate_num+1];
			}
		s_buffer[4]=0x00;
		s_buffer[5]=0x01;//读取寄存器个数
		crc_n(6);
		s_buffer[6]=crc_c.crc_w.crc_l;
		s_buffer[7]=crc_c.crc_w.crc_h;
		frame_send(8);
		comm_len=8;
		comm_flag=1;
		RCAP2H=RCAP2H_VALUE;
		RCAP2L=RCAP2L_VALUE;
		TR2=1;
		
		rstate_num++;	
		if(rstate_num>=rstate_max[mode])
			{
				rstate_num=0;
			}	
	}

void func_run(unsigned char m)
	{
		if((func_change==1)&&(comm_flag==0))	//操作功能码
			{
				s_buffer[0]=SLAVE_ADDR;
				if(m==1)	//mode=1;32字节输入输出
					{
						s_buffer[1]=receive_cmp[16];
						s_buffer[2]=receive_cmp[17];
						s_buffer[3]=receive_cmp[18];
						if(receive_cmp[16]==FUN_READ)	//读功能码
							{
								read_mode=2;
								s_buffer[4]=0x00;
								s_buffer[5]=receive_cmp[19]/2;//读取寄存器个数
								comm_len=6;
							}
						if(receive_cmp[16]==FUN_WRITE)	//写功能码
							{
								write_mode=2;
								s_buffer[4]=0;
								s_buffer[5]=receive_cmp[19]/2;	//寄存器个数
								s_buffer[6]=receive_cmp[19];		//数据字节数
								for(i=0;i<receive_cmp[19];i++)
									{
										s_buffer[7+i]=receive_cmp[20+i];//设定的值
									}
								comm_len=7+receive_cmp[19];
							}
						if(receive_cmp[16]==FUN_TEST)	//测试回路功能码
							{
								s_buffer[2]=TEST_ADDRH;//receive_cmp[17]
								s_buffer[3]=TEST_ADDRL;//receive_cmp[18]
								s_buffer[4]=TEST_DATAH;//receive_cmp[20]
								s_buffer[5]=TEST_DATAL;//receive_cmp[21]
								comm_len=6;
							}
					}
				if(m==2)	//mode=2;12字节输入输出
					{
						s_buffer[1]=receive_cmp[4];
						s_buffer[2]=receive_cmp[5];
						s_buffer[3]=receive_cmp[6];
						if(receive_cmp[4]==FUN_READ)	//读功能码
							{
								read_mode=2;
								s_buffer[4]=0x00;
								s_buffer[5]=0x01;	//读取寄存器个数固定为1
								comm_len=6;
							}
						if(receive_cmp[4]==FUN_WRITE)	//写功能码
							{
								write_mode=2;
								s_buffer[4]=0x00;
								s_buffer[5]=0x01;	//寄存器个数固定为1
								s_buffer[6]=0x02;	//数据字节数
								s_buffer[7]=receive_cmp[8];//设定的值
								s_buffer[8]=receive_cmp[9];
								comm_len=9;
							}
						if(receive_cmp[4]==FUN_TEST)	//测试回路功能码
							{
								s_buffer[2]=TEST_ADDRH;//receive_cmp[5]
								s_buffer[3]=TEST_ADDRL;//receive_cmp[6]
								s_buffer[4]=TEST_DATAH;//receive_cmp[8]
								s_buffer[5]=TEST_DATAL;//receive_cmp[9]
								comm_len=6;
							}
					}
				crc_n(comm_len);
				s_buffer[comm_len]=crc_c.crc_w.crc_l;
				s_buffer[comm_len+1]=crc_c.crc_w.crc_h;
				comm_len=comm_len+2;
				frame_send(comm_len);
				func_change=0;
				comm_flag=1;
				RCAP2H=RCAP2H_VALUE;
				RCAP2L=RCAP2L_VALUE;
				TR2=1;
			}
	}
//*****************************************************************************
void uart_run(void)
	{
		if(mode==0)
			{
				ctrl_mult();	//控制从机运行
				if(comm_flag==0)//读取变频器信息
					{
						read_state(mode);
					}
			}
		if((mode==1)||(mode==2))
			{
				ctrl_mult();	//控制从机运行
				func_run(mode);
				if(comm_flag==0)//读取变频器状态和故障信息
					{
						read_state(mode);
					}
			}
			
		if(timer2_num>=20)//400ms
			{
				timer2_num=0;
				comm_error=1;
				timer2_num1++;
			}
			
		if(timer2_num2>=100)// 1.6s发送多次收不到回应时,发数据的间隔加大
			{
				timer2_num2=0;
				timer2_num=0;
				comm_error=1;
			}
			
		if(comm_error==1)
			{	
				comm_enum++;
				comm_error=0;
				RI=0;
				ES=1;
				uart_number=0;
				uart_complete=0;

				if(comm_enum==5)
					{
						comm_enum=0;
						comm_flag=0;
					}
				else frame_send(comm_len);
			}

		 if(uart_complete==UART_COMPLETE)
			{	
				uart_analyze();
			}
	}
		
//串形中断,接收CIMR发来的数据
void uart_int(void)  interrupt 4  using 2
 	{
		unsigned char data u;
		
		u=SBUF;
		r_buffer[uart_number]=u;
		RI=FALSE;
		TH0=TH0_VALUE;	//装入初始值
		TL0=TL0_VALUE;	//装入初始值
		TR0=TRUE;
		uart_number++;
		if((uart_number==1)&&(u!=SLAVE_ADDR))
			{
				uart_number=0;
			}
	}

//收到一个字节的数据后35mS,没有再收到数据,则证明该数据帧已经接收完
void	timer0_int(void) interrupt 1 using 3
	{	
		TR0=FALSE;
		TF0=FALSE;	
		ES=FALSE;
		RI=FALSE;
		uart_complete =UART_COMPLETE;		
	}

void	timer2_int(void) interrupt 5 using 0
	{
		TF2=FALSE;	
		RCAP2H=RCAP2H_VALUE;
		RCAP2L=RCAP2L_VALUE;
		if(timer2_num1<=0x03)
			timer2_num++;
		else	
			{
				timer2_num=0;
				timer2_num2++;
			}
	}

⌨️ 快捷键说明

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