/********************************************************************* ** 实验目的:实现用一个数组接收10个数据然后再将这10个数据发送回去 ** 遇到问题:接收的数据不能够改变,每次接收后都返回第一次接收到的 10个数据。 ** 调试软件: 串口精灵 *********************************************************************/
/******************************************************************** ********* ********** ********* 文件名: MeUsart.h ********** ********* 编译软件: EWAVR V4.21a ********** ********* 编译日期: 22/03/08 ********** ********* ********** ********************************************************************/ #ifndef __MEUSART_H_ #define __MEUSART_H_ /******************************************************************** ********* 调入相应CPU的头文件 ********** ********************************************************************/ #include"MeHard.h"
/******************************************************************** ********* 宏定义 ********** ********************************************************************/ #define BAUDRATE 9600 //定义串口波特率 #define Send_Mode 1 //定义串口发送模式。0=查询发送 // 1=中断发送 /******************************************************************** ********* 变量定义 ********** ********************************************************************/ unsigned char *Com_P; //定义串口指针 unsigned char Current_Number=0; //串口当前发送、接收字节数 unsigned char Byte_Number=1; //串口需要发送、接收字节数 unsigned char Txd_Sending=0; //数据发送中标志 unsigned char Rxd_Receive=1; //数据接收中标志
/******************************************************************** ********* ********** ********* 函数名: Inq_Usart_Send ********** ********* 函数功能: 串口发送程序,查询方式 ********** ********* 编译日期: 22/03/08 ********** ********* ********** ********************************************************************/ void Inq_Usart_Send(void) { while (Current_Number<Byte_Number) { while(!(UCSRA&(1<<UDRE))); UDR=*Com_P; Com_P++; Current_Number++; } Current_Number=0; Txd_Sending=0; }
/******************************************************************** ********* ********** ********* 函数名: Int_Usart_Send ********** ********* 函数功能: 串口发送程序,中断方式 ********** ********* 编译日期: 22/03/08 ********** ********* ********** ********************************************************************/ #pragma vector=USART_TXC_vect __interrupt void Int_Usart_Send(void) { Com_P++; Current_Number++; if (Current_Number<Byte_Number) { UDR=*Com_P; } else { Current_Number=0; Txd_Sending=0; } }
/******************************************************************** ********* ********** ********* 函数名: Int_Usart_Receive ********** ********* 函数功能: 串口接收程序,中断方式 ********** ********* 编译日期: 22/03/08 ********** ********* ********** ********************************************************************/ #pragma vector=USART_RXC_vect __interrupt void Int_Usart_Receive(void) { *Com_P=UDR; Com_P++; Current_Number++; if(Current_Number>=Byte_Number) { Current_Number=0; Rxd_Receive=0; } }
/******************************************************************** ********* ********** ********* 函数名: Usart_Send ********** ********* 函数功能: 单字节串口发送 ********** ********* 编译日期: 22/03/08 ********** ********* ********** ********************************************************************/ void Usart_Send(void) { Txd_Sending=1; if (Send_Mode) { UDR=*Com_P; } else { Inq_Usart_Send(); } }
/******************************************************************** ********* ********** ********* 函数名: Init_Usart ********** ********* 函数功能: 串口初始化程序 ********** ********* 编译日期: 22/03/08 ********** ********* ********** ********************************************************************/ void Init_Usart(void) { UCSRC=(1<<URSEL)|0x06; UBRRL=(F_CPU/BAUDRATE/16-1)%256; UBRRH=(F_CPU/BAUDRATE/16-1)/256; UCSRA=0x00; if (Send_Mode) { UCSRB=(1<<RXEN)|(1<<RXCIE)|(1<<TXEN)|(1<<TXCIE); } else { UCSRB=(1<<RXEN)|(1<<RXCIE)|(1<<TXEN); } } #endif
/********************************************************************* ** 实验目的:实现用一个数组接收10个数据然后再将这10个数据发送回去 ** 遇到问题:接收的数据不能够改变,每次接收后都返回第一次接收到的 10个数据。 ** 调试软件: 串口精灵 *********************************************************************/
#include"MeUsart.h"
unsigned char Temp[11]={0,1,2,3,4,5,6,7,8,9};
int main() { Init_Usart(); //串口初始化 Com_P=Temp; //设置串口指针指向的数组 Byte_Number=10; //设置需要接收的字节数 Current_Number=0; //设置当前已接收字节数 _SEI(); //开中断 while(1) { while(Rxd_Receive); //等待串口接收完 Com_P=Temp; //重新定向串口指针指向的数组 Byte_Number=10; //设置需要发送的字节数 Usart_Send(); //串口发送 while(Txd_Sending); //等待串口发送完 Com_P=Temp; //重新定向串口指针指向的数组 Rxd_Receive=1; //等待接收 Byte_Number=10; //定义接收数据字节数 } }
第一次用AVR 不太明白的地方大家多指教. |