?? methanoluart.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; //串口傳輸時(shí)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) //是否和設(shè)定的幀標(biāo)志相等?有多種幀類型時(shí),以或運(yùn)算添加其他標(biāo)志
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); //本幀數(shù)據(jù)字節(jié)
putchar(action); //數(shù)據(jù)
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)) //判斷是否幀頭,且上一幀數(shù)據(jù)處理完畢
{
length = (data & 0x0F);
for(i = 0;i < length;i++)
{
cnt = 0;
while( !(UCSR0A & (1 << RXC0)) )
{
if(cnt++ > 8000) //超時(shí)
{
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; //恢復(fù)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); //等待發(fā)送緩存空,本不需等待,實(shí)際操作時(shí)發(fā)現(xiàn)有此問題
UDR0=tx_buffer0[tx_rd_index0];
if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0;
};
}
unsigned long Speed;
unsigned int DurationOrigin; //原機(jī)噴射脈寬
unsigned int DurationPatch; //補(bǔ)充的脈寬
unsigned int DurationCS; //冷啟動(dòng)噴射脈寬
extern signed char Tempr; //缸頭溫度
extern unsigned char K; //補(bǔ)償系×10 必須小于14,否則有溢出
extern unsigned char LineAdjust; //冷啟動(dòng)圈數(shù)調(diào)整,上位機(jī)調(diào)整用 100 = 不調(diào)整圈數(shù)
extern unsigned char InjectorK; //冷啟動(dòng)油嘴/原機(jī)油嘴(相同噴油量的時(shí)間比)
extern unsigned int ColdStartLine; //冷啟動(dòng)需要的圈數(shù)
extern unsigned int RevCnt; //啟動(dòng)后運(yùn)行的圈數(shù)
extern unsigned char ADCnt;
//上傳狀態(tài)參數(shù)
void SendStatusPara(void)
{
if(tx_counter0 == 0) //緩存為空(上次數(shù)據(jù)發(fā)送完畢)
{
putchar(FRAMEFLAG1); //幀頭
putchar(9); //數(shù)據(jù)字節(jié)數(shù)
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); //幀尾
}
}
//串口通訊數(shù)據(jù)處理函數(shù)
void DisposeBufDatas(void)
{
//定義變量
unsigned char rev;
if(rx_counter0) //收到幀
{
char frameFlag;
char cSREG;
cSREG = SREG;
if(rx_error0) //接收錯(cuò)誤
{
SendMessage(SENDAGAIN);
}
else
{
frameFlag = getchar(); //獲取幀頭
switch(frameFlag)
{
case 1:
//從緩存中讀取數(shù)據(jù)
K = getchar();
LineAdjust = getchar();
InjectorK = getchar();
// FeedbackCyc += (((unsigned int)getchar()) << 8);
SendMessage(REVSUCCEED);
WriteERom();
break;
case 2:
//上傳控制參數(shù)
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)
//轉(zhuǎn)換數(shù)據(jù)
}
FlashRxBuf();
SREG = cSREG; //恢復(fù)現(xiàn)場
}//if(rx_counter0)
}//DisposeBufDatas(void)結(jié)束
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -