⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uarttest.c

📁 AVR 128 单片机 串口 自定义指令处理程序
💻 C
字号:
#include <iom128v.h>
#include <macros.h>

#define CMD		   'O' 
#define END		   'E'
#define INVAIL	   0
#define READY	   'R'
#define BUSY	   'B'


#define CONNECT	   'C' 	//连接
#define WAIT	   'W'  //等待
#define MOVEX	   'X'	//X移位
#define MOVEY	   'Y'	//Y移位
#define	MOVEXY	   'P'	//X-Y移位

#define  uchar	   unsigned char
#define  EOS	   'A'
#define BUFFLEN	   40
#define CMDLEN	   5

struct COMMAND{	   	  		//指令结构
	   		   uchar cmd;
			   uchar dat1;
			   uchar dat2;
			   };

uchar buff[BUFFLEN],bcnt=00,bhead=0,bend=0;	  //接受数据缓存 及计数器
unsigned char ccnt=0;						  //指令队列计数器
struct COMMAND	cmd_buff[15]={{0,0,0}};	  	  //指令队列

void Send_Str(uchar * str);

void showbuff(void){
	 				char i;
					Send_Str(" [Buff: A");
					for(i=0;i<BUFFLEN;i++)
							{
							if(buff[i]==INVAIL) putchar('-');
							else putchar(buff[i]);
							}
					Send_Str(" ] A");
					putchar(' ');
					}

void Cmd_buffPro(void)
	 {uchar i,j=0,tbend,t=0,f=0;
	  tbend=bcnt;
	  i=bhead;
	  
	  while(i!=tbend)
	  	{tbend=bcnt;
		if(buff[i]==CMD)
			{
			f=1;
	
			if(bhead<=tbend)
				{
				if((((i+CMDLEN-1)%BUFFLEN>bhead)&&((i+CMDLEN-1)%BUFFLEN<tbend))) t=1;else t=0;
				}else {
					  if((((i+CMDLEN-1)%BUFFLEN>bhead)||((i+CMDLEN-1)%BUFFLEN<tbend))) t=1;else t=0;
					  }
			if(t)
				{
				if(buff[(i+CMDLEN-1)%BUFFLEN]==END)
					{
					f=0;
					
				 	//Send_Str(" [CMD] A");j++;
					//putchar(j+'0');
				 
				 	ccnt=ccnt+1;buff[i%BUFFLEN]=INVAIL;
				 	cmd_buff[ccnt].cmd =buff[(i+1)%BUFFLEN];buff[(i+1)%BUFFLEN]=INVAIL;
				 	cmd_buff[ccnt].dat1=buff[(i+2)%BUFFLEN];buff[(i+2)%BUFFLEN]=INVAIL;
				 	cmd_buff[ccnt].dat2=buff[(i+3)%BUFFLEN];buff[(i+3)%BUFFLEN]=INVAIL;
				 	buff[(i+4)%BUFFLEN]=INVAIL;
				 
				 	bhead=((i+CMDLEN)%(BUFFLEN)); 
				 	i=bhead; 
					
				 	//putchar('[');putchar(i/10+'0');putchar(i%10+'0');putchar(']');
				 	//putchar('[');putchar(tbend/10+'0');putchar(tbend%10+'0');putchar(']');
					}else {
						   f=0;buff[i]=INVAIL;
						  }
				}
			}else{
				  if(f==0)buff[i]=INVAIL;
				  i++;
				  i=i%BUFFLEN;bhead=i;
				 }
		}
	 
	 }
	 
void Cmd_pro(void)
	 {uchar i;
	 
	 if(ccnt>0)
	 	{
	 	for(i=0;i<ccnt;i++)
	 		{
			cmd_buff[i].cmd=cmd_buff[i+1].cmd;
			cmd_buff[i].dat1=cmd_buff[i+1].cmd;
			cmd_buff[i].dat2=cmd_buff[i+1].cmd;
			
			putchar('[');putchar(('0'+ccnt));
			Send_Str(":proCMD] A");
			putchar(cmd_buff[0].cmd);	

			}
		 ccnt--;
		
	 	switch(cmd_buff[0].cmd)
	 		{
			case CONNECT:Send_Str("connect A");break;
			case WAIT	:Send_Str("waiting A");break;
			case MOVEX	:Send_Str("movex A");break;
			case MOVEY	:Send_Str("movey A");break;
			case MOVEXY :Send_Str("movexy A");break;
			default:Send_Str("Inlegal Command!A");break;
			}
	 	}
	 }
	 
#pragma interrupt_handler ReceivePro:19
void ReceivePro(void)	  //串口接受中断服务程序
	{
	buff[bcnt]=UDR0;
	bcnt++;
	bcnt=bcnt%(BUFFLEN);
	
	showbuff();
	//putchar('['); putchar('H'); putchar(':');putchar(bhead/10+'0');putchar(bhead%10+'0');putchar(']');
	//putchar('['); putchar('b'); putchar(':');putchar(bcnt/10+'0');putchar(bcnt%10+'0');putchar(']');
	}

void Send_Str(uchar * str)		//串口发送程序
	 {
	 while(*str!=EOS)
	 	{
		putchar(*(str++));
		}
	 }
void USART_Init(unsigned int baud)			  //串口初始化
	 {
	 UBRR0H=0;//(uchar) (baud>>8);
	 UBRR0L=51;//(uchar) baud;
	 
	 UCSR0B=(1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
	 UCSR0C=0x06;
	 }
	 
void main()
	 {
	 DDRB=0XFF;
	 PORTB=0X01;	 
	 
	 USART_Init(0X06);
	 _SEI();
	 
	 showbuff();
	  
	 //Send_Str("C=connect  W=wait  X=movex  Y=movey  P=movexy A");
	 while(1) {
	 		  Cmd_buffPro();
			  Cmd_pro();
			  }
	 }
	 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -