实验现象:我通过触摸屏给mega128uart0发送9个字节数据,下位机接收正确指令后,给屏的寄存器多次发送8个字节数据,从而改变屏内寄存器参数。一般情况下,我的指令下位机可以正常接收的并发送给触摸屏,问题的关键是,我多次快速点击触摸屏时,下位机的就无法发送数据并修改触摸屏的参数了。代码如下:
//--------------UART接受中断函数-----------------
#pragma interrupt_handler uart_rx0:19
void uart_rx0(void)
{
static uchar I=0; //定义局部函数内的静态变量
UCSR0B&=~BIT(RXCIE0); //从上位机读取数据,RX中断使能关闭
// UCSR1B&=~BIT(RXCIE1); //从上位机读取数据,RX中断使能关闭
String0[I]=UDR0;
I++;
if(I==9)
{
I=0;
flag0=1;
}
//UCSR1B|=BIT(RXCIE1);//RX中断使能打开
UCSR0B|=BIT(RXCIE0);//RX中断使能打开
}
void UART_Send0(uchar Data[],uint num)
{
uint I;
// PORTD|=BIT(PD4);//PD=1 发送。
for(I=0;I<num;I++)
{
while(!(UCSR0A&(BIT(UDRE0)))); //数据寄存器UDR是否为空
UDR0=Data[I]; //UDR赋值
while(!(UCSR0A&(BIT(TXC0)))); //数据是否已经发送完毕?
UCSR0A|=BIT(TXC0); //清除发送完毕标志位
}
delay(2);
// PORTD&=~BIT(PD4);//PD=0;接收
}
void uart0_init(uint baud)
{
UCSR0B=0x00;
UCSR0A=0x00; //控制寄存器清零
UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);
//选择UCSRC,异步模式,禁止
// 校验,1位停止位,8位数据位
baud=mclk/16/baud-1 ; //波特率最大为65K
UBRR0L=baud;
UBRR0H=baud>>8; //设置波特率
UCSR0B=(1<<TXEN0)|(1<<RXEN0)|(1<<RXCIE0); //UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
//接收、发送使能,接收中断使能
// SREG=BIT(7); //全局中断开放
DDRE|=0X02; //配置TX0为输出(很重要)
//DDRD&=~BIT(0);
}
、、、、、、、、、、、、、
void main(void)
{
//、、、、、、、、、、、、、下面是主程序,我省略了部分派生变量
while(1)
{
if(flag0==1) //接收中断接收完成
{
flag0=0;
memmove(str0,String0,9);//取代FOR循环,str0是我读出缓冲区中的字节
if(str0[5]==0x08) //放大或缩小切换页面
{
if(str0[8]==0x04)//页面1
{
FD[7]=0x12; //纵轴放大倍数18
UART_Send0(FD,8);
delay(2);
YM[6]=0x01;
UART_Send0(YM,8);
delay(2);
}
if(str0[8]==0x01||str0[8]==0x06)//页面2
{
FD[7]=0x36;//纵轴放大倍数54
UART_Send0(FD,8);
delay(2);
YM[6]=0x02;
UART_Send0(YM,8);
delay(2);
}
if(str0[8]==0x03)//页面3
{
FD[7]=0x5A;//纵轴放大倍数90
UART_Send0(FD,8);
delay(2);
YM[6]=0x03;
UART_Send0(YM,8);
delay(2);
}
|