昨晚搬动了电脑 今早又瞎忙了一上午 那个汗呀 加上身边环境蛮吵的 那个心烦着呢 现在就抽点时间敲敲键盘写写 算是整理一下此刻糟糕透顶的心情 也算是继续总结 总不能让这个系列的假期总结给落下来
    既然说到这里了 就说下感受吧 虽然这个系列   内容看起来真的好简单 连程序也是写简简单单的 才刚入门的程序 但偶还是很珍惜 因为这些东西是自己花费假期时间自己学习 自己做板子 然后编好程序 并把它放到板子上去调试  这些真正是属于自己的东西  基本的东西因为是最为牢靠的呢 所以偶是珍惜这些的 不管是这些小程序 还是这个学习过程 貌似废话说多了 汗 就当是晒晒偶的已经发霉的心情吧
    回奔主题哦 现在就总结下 关于AVR的串口通信吧 这里使用的是AVR的异步串行接口的功能 通过超级终端或串口调试助手向AVR发送数据 以*开始以#结束 单片机存储的是*#之间的数据 发送R可以将AVR最后一次记录的数据传送给PC机 接收到新的数据 以前的数据将会被消除 数据长度在255个字节之内
     好了程序如下:
#include < iom16v.h  >
#include < macros.h >
#define uchar unsigned char
#define uint unsigned int
 
uchar RecvData [ 255 ]  ;    //记录接收到的数据
uchar  i  = 0 ;
uchar  NewBeginFlag = 0 ;//接收到新的数据 清楚原有的数据
uchar RecvDataFlag = 0 ;    //当有新的数据传接收时置1,结束时为0
uchar ReadFlag = 0 ;            //读数据标志
 
//串口初始化
void UartOInit ( void )
{
     UCSRB = 0x00 ;                                          //关串口
     UCSRA = 0x02 ;                                        //倍速模式
     UCSRC = BIT(URSEL) | 0x06;                 //写UCSRC寄存器,设定8个bit
     UBRR  = 0x000c;                                      //设定串口波特率为9600
     UCSRB = 0x98;                                        //开串口
}
 
 //串口中断服务函数
 #pragam interrupt_handler UartRecvData : 12
void UartRecvData(void)
{
    uchar temp;
    temp = UDR;
    if ( temp == '*' )           //判断是否是数据开始标志
   {
        NewBeginFlag = 1;
        RecvDataFlag = 1;
   }
   else if ( RecvDataFlag )
   {
        if ( temp == '#' )    //判断是否是数据结束标志
        {
             RecvDataFlag = 0;   //置接收结束标志
        }
        else
       {
           RecvData[i++] = temp;  //暂存数据
        }
   }
   else if ( ( temp == 'R' ) || ( temp == 'r ' ) )
   {
         ReadFlag = 1;
   }
}
 
//发送字符串
void UartTransmitData ( void )
{
      uchar j , Er[6] = "ERROR";
      if ( i == 0 )                                            //判断接收到的数据是否为空
     {
          for ( j = 0;j < 5; j++ )
         {
               while ( ! ( UCSRA & 0x20 ) );  //等待数据寄存器为空
               UDR = Er [ j ];                           //发送字符
         }  
     }
     else
     {
          for ( j = 0;j < i; j++)
         {
                while ( ! ( UCSRA & 0x20 ) );      //等待数据寄存器为空
                UDR = RecvData[j];                    //发送字符
         }
     }
}
 
//初始化各种信息
void InitDevice ( void )
{
     CLI ( ) ;                //关全部中断
     Uart0Init ( ) ;
     MCUCR = 0x00;
     SEI ( ) ;
}
 
//主函数
void main ( void )
{
     uchar j;
     InitDevices ( );
     while(1)
    {
        if ( NewBeginFlag )     //有新的数据接收,清除原有数据
       {
            NewBeginFlag = 0;
           for ( j = 1; j ; j++ )
          {
              RecvData [ j ] = 0;
          }
       }
       if ( ReadFlag )
      {
          UartTransmitData ( ) ;
          ReadFlag = 0;
      }
   }
}
 
 
嘿就这样先  还得说一下呢 寄存器的处理 也就是串口的初始化  以及数据的接收与发送 要好好才处理