昨晚搬动了电脑 今早又瞎忙了一上午 那个汗呀 加上身边环境蛮吵的 那个心烦着呢 现在就抽点时间敲敲键盘写写 算是整理一下此刻糟糕透顶的心情 也算是继续总结 总不能让这个系列的假期总结给落下来
既然说到这里了 就说下感受吧 虽然这个系列 内容看起来真的好简单 连程序也是写简简单单的 才刚入门的程序 但偶还是很珍惜 因为这些东西是自己花费假期时间自己学习 自己做板子 然后编好程序 并把它放到板子上去调试 这些真正是属于自己的东西 基本的东西因为是最为牢靠的呢 所以偶是珍惜这些的 不管是这些小程序 还是这个学习过程 貌似废话说多了 汗 就当是晒晒偶的已经发霉的心情吧
回奔主题哦 现在就总结下 关于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;
}
}
}
嘿就这样先 还得说一下呢 寄存器的处理 也就是串口的初始化 以及数据的接收与发送 要好好才处理