📄 uarttest.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 + -