comm.c

来自「这是用C8051F020单片机实现双串口通信功能的源代码。两个串口可以同时独立收」· C语言 代码 · 共 761 行 · 第 1/3 页

C
761
字号
/****************************串口通信部分程序*******************************/
/****************************485通信波特率由定时器2设置*********************/
/*****************由定时器1形成专门供通信的中断程序*************************/
/****************************串口通信部分程序*******************************/
/****************************485通信波特率由定时器2设置*********************/
/*****************由定时器1形成专门供通信的中断程序*************************/

/*注意:在中斷中需要注意*/ 

#include <c8051f020.h>
#include <GMUDef.h>
#define _COMM_DATA_
#include <Comm.h>

#define READ_REGISTER 0x03            //读寄存器命令
#define WRITE_REGISTER 0x10           //写寄存器命令
#define CORRECT 1                     //正确
#define FAULT   0                     //错误
#define BAD_COMMAND  0xff             //接收到错误的命令

//定义读写控制寄存器
extern xdata union { unsigned char Chr[2];unsigned int IntData;} CommStation_save;//子站地址
extern xdata unsigned char CommStation;
extern xdata unsigned char baud_num[2];
//extern xdata unsigned char key_read_register;  //度键盘的寄存器
//extern xdata unsigned char e485n_write_register;  //写控制信号的寄存器
//extern xdata unsigned char dir_write_register;  //写控制信号的寄存器
extern xdata unsigned char RamFlag;
extern xdata unsigned char baut_num;           //波特率的计数器:1表示9600,2表示4800,3表示2400,4表示1200

//以下为定义的函数原型
void receive_data_process(void);
void receive_data_process_add(void);
void receive_crc_process(void);
void receive_crc_process_add(void);
void send_data_process(void);
void send_data_process_add(void);
void send_crc_process(void);
void send_crc_process_add(void);
void TimeOver_Handle(void);
void TimeOver_Handle_add(void);


unsigned int CRC16(unsigned char *msg,unsigned char len);
void Comm_Init_Over_Time(void);

//通信部分的主程序
Comm_Main()
{
//以下为发送部分
	if(receive_all_over_flag==1) {	           /* 如果主控制器发来的数据已经接收完毕,将数据回应的标志置位 */
          
       over_time_num++;
       if(over_time_num>=1000){               //如果0.5秒都没有回答完毕,则说明有问题,通信复位
	      over_time_num=0;
          TimeOver_Handle();
       }
	   else{

	      if(TI0==1){
	             TI0=0;
				 if(CommCommand==READ_REGISTER){
				    
/*				    if(comm_start_register_addr_error_flag==1){  //开始地址非法的处理
					   if(TmpCommChr==5){ 
                       TimeOver_Handle();

	                   }
					   else
				       if((TmpCommChr>2)&&(TmpCommChr<5)){ 
				          send_crc_process();
					   }
					   else
				       if(TmpCommChr==2){ 
						  comm_time_over_num=0;
					      SBUF0=0xaa;
						  CommBuf[TmpCommChr]=0xaa;
		                  TmpCommChr++;
					   }
                       else{
			              comm_time_over_num++;                       //超时处理开始
			              if(comm_time_over_num>=20)
                          TimeOver_Handle();
                       }	      
					}
       
					else
					if(comm_register_num_error_flag==1)  //寄存器个数非法的处理
					   if(TmpCommChr==5){ 
                       TimeOver_Handle();
	                   
                       else
				       if((TmpCommChr>2)&&(TmpCommChr<5)){ 
				          send_crc_process();
					   }
					   else
				       if(TmpCommChr==2){ 
						  comm_time_over_num=0;
					      SBUF0=0xbb;
						  CommBuf[TmpCommChr]=0xbb;
		                  TmpCommChr++;
					   }
                       else{
			              comm_time_over_num++;                       //超时处理开始
			              if(comm_time_over_num>=20)
                          TimeOver_Handle();
                       }	      
					}

					else*/
					if((comm_start_register_addr_error_flag==0)&&(comm_register_num_error_flag==0)){//正常报文处理
                       if(TmpCommChr-send_size_num==5){    
					      TimeOver_Handle();
	                   }
					   else
				       if((TmpCommChr<send_size_num+5)&&(TmpCommChr>=send_size_num+3)) 
				       send_crc_process();

					   else
	                   if((TmpCommChr<send_size_num+3)&&(TmpCommChr>1))     
					   send_data_process();

                       else{
			              comm_time_over_num++;                       //超时处理开始
			              if(comm_time_over_num>=20)
                          TimeOver_Handle();
                       }	      
					}

                    else
                    TimeOver_Handle();	      
				 }
 
				 else
				 if(CommCommand==WRITE_REGISTER){
/*				    if(comm_start_register_addr_error_flag==1){
					   if(TmpCommChr==5){ //开始地址非法的处理
                       TimeOver_Handle();
	                   }
					   else
				       if((TmpCommChr>2)&&(TmpCommChr<5)) //开始地址非法的处理
				       send_crc_process();

					   else
				       if(TmpCommChr==2){ //开始地址非法的处理
						  comm_time_over_num=0;
					      SBUF0=0xaa;
						  CommBuf[TmpCommChr]=0xaa;
		                  TmpCommChr++;
					   }
                       else{
			              comm_time_over_num++;                       //超时处理开始
			              if(comm_time_over_num>=20)
                          TimeOver_Handle();
                       }	      
					}

					else
					if(comm_register_num_error_flag==1){
					   if(TmpCommChr==5) //寄存器个数非法的处理
                       TimeOver_Handle();

					   else
				       if((TmpCommChr>2)&&(TmpCommChr<5)) //寄存器个数非法的处理
				          send_crc_process();
					   
					   else
				       if(TmpCommChr==2){ //寄存器个数非法的处理
					      comm_time_over_num=0;     
					      SBUF0=0xbb;
						  CommBuf[TmpCommChr]=0xbb;
		                  TmpCommChr++;

					   }
                       else{
			              comm_time_over_num++;                       //超时处理开始
			              if(comm_time_over_num>=20)
                          TimeOver_Handle();
                       }	      
					}

					else*/
					if((comm_start_register_addr_error_flag==0)&&(comm_register_num_error_flag==0)){//正常报文处理
				       if(TmpCommChr==8){                 
                          TimeOver_Handle();
					      comm_over_and_change_value_start=1;//一次写寄存器通信完成,在主循环中响应的标志
					   }
					   else
					   if((TmpCommChr==6)||(TmpCommChr==7))
					   send_crc_process();

					   else
					   if((TmpCommChr>1)&&(TmpCommChr<6))
                       send_data_process();

                       else{
			              comm_time_over_num++;                       //超时处理开始
			              if(comm_time_over_num>=20)
                          TimeOver_Handle();
                       }	      
					}

                    else
                    TimeOver_Handle();	      
				 }

                 else{
			        comm_time_over_num++;                       //超时处理开始
			        if(comm_time_over_num>=20)
                    TimeOver_Handle();
                 }	      	  
				 
	  	         if(TmpCommChr==1){
				        comm_time_over_num=0;
	                    SBUF0=CommCommand;
						CommBuf[1]=CommCommand;
		                TmpCommChr=2;
						send_register_num_over_flag=0;
						ii=1;
						jj=0;
	             }
	      }

	   	  if(TmpCommChr==0){
		         comm_time_over_num=0;
	             SBUF0=CommStation;
				 CommBuf[TmpCommChr]=CommStation;
		         TmpCommChr=1;
	      } 
	   }
	}

//以下为接收部分	
	else{                              /*如果还没有接收完主控制器发来的数据*/	
	      if(TI0==1)                    
	      TI0=0;
	      if(receive_addr_over_flag==1){		         
	             if(receive_command_over_flag==1){
		               if(receive_start_register_addr_over_flag==1){					     
			                   if(receive_register_num_over_flag==1){		 
							            if(receive_data_over_flag==1){				 
										       if(receive_crc_over_flag==1&&CRC_flag==CORRECT){
//                                                       P4&=~0x10;//不选中RAM,即IO_CS=0;
//   		                                               e485n_write_register=0xff;//485EN=1;变换为写
//                                                       P4|=0x10;//选中RAM,即IO_CS=1;
                                                       ENABLE_485_WRITE1
												       receive_to_send_num++;
													   if(receive_to_send_num>=50){//转至发送状态
							                                receive_all_over_flag=1;  
 	                                                        receive_to_send_num=0;

                                                            receive_crc_over_flag=0;
									                        receive_data_over_flag=0;
													        receive_size_num_over_flag=0;

⌨️ 快捷键说明

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