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

📄 methanoluart.txt

📁 一个汽油发动机燃烧甲醇的项目
💻 TXT
字号:
#include <main.h>
//extern unsigned char OilMapCoef;

// USART0 Receiver buffer 
#define RX_BUFFER_SIZE0 16 
char rx_buffer0[RX_BUFFER_SIZE0]; 
volatile unsigned char rx_rd_index0,rx_counter0; 
// This flag is set on when USART0 Receival is error 
volatile unsigned char rx_error0;
volatile unsigned char FrameHead0;


// USART0 Transmitter buffer 
#define TX_BUFFER_SIZE0 40 
char tx_buffer0[TX_BUFFER_SIZE0]; 
volatile unsigned char tx_wr_index0,tx_rd_index0,tx_counter0; 

//volatile unsigned char IsInterfere = 0;    //串口传输时AD不可靠 


void FlashRxBuf(void)
{
  rx_error0 = 0;
  rx_counter0 = 0;
  rx_rd_index0 = 0;
  FrameHead0 = 0;
}

//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
// char size: 8 bit
// parity: Even
void uart0_init(void)
{
 UCSR0B = 0x00; //disable while setting baud rate
 UCSR0A = 0x00;
 UCSR0C = 0x26;
 UBRR0L = 0x33; //set baud rate lo
 UBRR0H = 0x00; //set baud rate hi
 UCSR0B = 0xD8;
 FlashRxBuf();
}




/*char TestFrameHead(char data)
{
  if((data & 0xF0) == 0xF0)  //是否和设定的帧标志相等?有多种帧类型时,以或运算添加其他标志
    return 1;
  else 
    return 0;	
}*/

// Write a character to the USART0 Transmitter buffer 
void putchar(char c) 
{ 
  char cSREG;   
  cSREG = SREG;
  
  while (tx_counter0 == TX_BUFFER_SIZE0); 
  CLI(); 
  if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0)) 
    { 
      tx_buffer0[tx_wr_index0]=c; 
      if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0; 
      ++tx_counter0; 
    } 
  else 
    UDR0=c;
	
  SREG = cSREG; 
} 

void SendMessage(unsigned char action)
{
  char cSREG;   
  cSREG = SREG;
  
  CLI();
  putchar(COMMANDHEAD);        //帧头
  putchar(1);                  //本帧数据字节
  putchar(action);             //数据
  putchar(FRAMETAIL);          //帧尾
  
  SREG = cSREG;     
}


// USART0 Receiver interrupt service routine 
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void) 
{ 
  char status,data,length,i; 
  unsigned int cnt;
  status=UCSR0A; 
  data=UDR0; 
  rx_counter0 = 0;
  
  if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) 
    { 
//	  OilMapCoef = data;
	  if(((data & 0xF0) == 0xF0) && (rx_counter0 == 0))  //判断是否帧头,且上一帧数据处理完毕
	  {
          length = (data & 0x0F);
		  for(i = 0;i < length;i++)
		  {
		    cnt = 0;
		    while( !(UCSR0A & (1 << RXC0)) )
		    {
			  if(cnt++ > 8000)     //超时
			  {
			    FlashRxBuf();
				SendMessage(SENDAGAIN);
			    return;
			  }	
			}  
			data = UDR0;
		    rx_buffer0[rx_counter0]=data;  
            if (++rx_counter0 == RX_BUFFER_SIZE0) 
            {  
              rx_counter0 = 0; 
              rx_error0 = 1; 
            }
		  }
		  	
	  } 
		     
      else 
       {
//         rx_error0 = 1 ;
         FlashRxBuf();	
		 SendMessage(SENDAGAIN);
       }	
  }//if ((status & (FRAMI...
} 



// Get a character from the USART0 Receiver buffer 
char getchar(void) 
{ 
  char cSREG,data;   
  cSREG = SREG; 
   
  while (rx_counter0==0); 
  data=rx_buffer0[rx_rd_index0]; 
  if(++rx_rd_index0 == RX_BUFFER_SIZE0) 
    rx_rd_index0=0; 

	
  CLI(); 
  --rx_counter0; 
  SREG = cSREG;      //恢复SREG
  
  return data; 
}




// USART0 Transmitter interrupt service routine 
#pragma interrupt_handler uart0_tx_isr:iv_USART0_TXC
void uart0_tx_isr(void)
{ 
  if (tx_counter0) 
    { 
      --tx_counter0;
	  while((UCSR0A & (1 << UDRE0)) == 0);    //等待发送缓存空,本不需等待,实际操作时发现有此问题 
      UDR0=tx_buffer0[tx_rd_index0]; 
      if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0; 
    }; 
} 


unsigned long Speed;
unsigned int DurationOrigin;     //原机喷射脉宽
unsigned int DurationPatch;      //补充的脉宽
unsigned int DurationCS;         //冷启动喷射脉宽
extern signed char Tempr;               //缸头温度
extern unsigned char K;                  //补偿系×10  必须小于14,否则有溢出
extern unsigned char LineAdjust;      //冷启动圈数调整,上位机调整用  100 = 不调整圈数
extern unsigned char InjectorK;       //冷启动油嘴/原机油嘴(相同喷油量的时间比)

extern unsigned int ColdStartLine;          //冷启动需要的圈数
extern unsigned int RevCnt;                 //启动后运行的圈数
extern unsigned char ADCnt; 
//上传状态参数
void SendStatusPara(void)
{
 if(tx_counter0 == 0)        //缓存为空(上次数据发送完毕)
 {    
  putchar(FRAMEFLAG1);  //帧头
  putchar(9);         //数据字节数
  
  putchar((unsigned char)Speed);    
  putchar((unsigned char)(Speed >> 8));   //H
  
  putchar((unsigned char)Tempr);   
  
  putchar((unsigned char)DurationOrigin);    
  putchar((unsigned char)(DurationOrigin >> 8));   //H
 
/*  putchar((unsigned char)ColdStartLine);    
    putchar((unsigned char)(ColdStartLine >> 8));   //H  
  
  putchar((unsigned char)RevCnt);    
  putchar((unsigned char)(RevCnt >> 8));   //H */
   
  putchar((unsigned char)DurationPatch);    
  putchar((unsigned char)(DurationPatch >> 8));   //H
  
//  putchar((unsigned char)DurationCS);    
//  putchar((unsigned char)(DurationCS >> 8));   //H

  putchar((unsigned char)(ColdStartLine+1 - RevCnt ));    
  putchar((unsigned char)((ColdStartLine+1 - RevCnt) >> 8));   //H
	

  putchar(FRAMETAIL);  //帧尾
 } 
}


//串口通讯数据处理函数
void DisposeBufDatas(void)
{
 //定义变量
 unsigned char rev;
if(rx_counter0)     //收到帧
{
  char frameFlag;
  char cSREG;   
  cSREG = SREG;
 
 if(rx_error0)                 //接收错误
  {
   SendMessage(SENDAGAIN);
  } 
 else
 { 
   frameFlag = getchar();        //获取帧头
   switch(frameFlag)
   {
     case 1:
   //从缓存中读取数据
		K = getchar();
		LineAdjust = getchar();
		InjectorK = getchar();
//		FeedbackCyc += (((unsigned int)getchar()) << 8);
		SendMessage(REVSUCCEED);
		WriteERom();
	    break;	
	 case 2:  
	//上传控制参数
	    CLI();
		putchar(FRAMEFLAG2);
		putchar(3);
		putchar((unsigned char)K);
		putchar(LineAdjust);
		putchar(InjectorK);
//		putchar((unsigned char)(FeedbackCyc >> 8));		
		putchar(FRAMETAIL);
			
		SendMessage(READOK);
	    break;

	default:
	   break;			
   }//switch(frameFlag)				   
   //转换数据  

 }
 FlashRxBuf(); 
 SREG = cSREG;         //恢复现场 
}//if(rx_counter0) 
   
}//DisposeBufDatas(void)结束

⌨️ 快捷键说明

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