📄 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; //串口传输时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 + -