打印
[AVR单片机]

mega128双串口通讯,通讯过程中出错!!

[复制链接]
1340|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
元方义城|  楼主 | 2015-7-14 13:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实验现象:我通过触摸屏给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);
               
                         }

相关帖子

沙发
元方义城|  楼主 | 2015-7-17 13:24 | 只看该作者
好吧,自己已解决。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

158

帖子

4

粉丝