#include <avr/io.h> // 端口
#include <avr/interrupt.h> // 中断
#ifndef F_CPU
#define F_CPU 11059200UL
#endif
#define BAUDRATE 9600
#define Max_BUFF_Len 9 //接收的串口字符长度
uint8_t Uart_Buffer[Max_BUFF_Len];
uint16_t Uart_Rx=0;
uint8_t usart_flag; //串口标志位
void init_USART( void ) // USART 初始化
{
UCSRB=0x00; //禁止发送器和接收器,禁止串口中断
UCSRA = 0x00; //各标志位清零
UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); //写 ,异步,8位数据,无奇偶校验,一个停止位,无倍速
UBRRL = (F_CPU/BAUDRATE/16-1)%256; //9600
UBRRH = (F_CPU/BAUDRATE/16-1)/256;
UCSRB = (1<<TXEN)|(1<<RXEN)|(1<<RXCIE); // 使能发送 ,使能接收,使能接收中断
}
void uart_send(uint8_t data)
{
while(!(UCSRA&(1<<UDRE))); //第五位是否为1,从而满足条件退出循环发送数据
UDR=data;
while(!(UCSRA&(1<<TXC)));
UCSRA|=(1<<TXC); //写1进行清除操作
}
void usart_s(uint8_t * ptr) //发送字符串
{
while (*ptr)
{
uart_send(*ptr++);
}
}
int main(void)
{
init_USART();
sei();
{
uart_send(0x00);
if (usart_flag==1)
{
usart_s("halllo\r\n");
usart_flag=0;
DE_LOW;
}
}
}
ISR( USART_RXC_vect )
{
UCSRB&=~(1<<RXCIE); // 校验数据是否传输完成,关闭接收中断
Uart_Buffer[0] = UDR; // 接收串口数据到buff缓冲区
usart_flag=1; // 标志位至1
UCSRB|=(1<<RXCIE); // 接收完毕,开启接收中断
}
基本的串口收发代码
收到数据后标志位置1,在主函数中发送代码,也可以判断收到的函数是否是自己想要的数据。
例如:
if(Uart_Buffer[]==0xaa)
{
usart_flag=1; // 标志位至1
}
else
usart_flag=0;