13
198
1175
金牌会员
使用道具 举报 送花
void Uart1_Isr(void) interrupt 4 { if (TI) //检测串口1发送中断 { TI = 0; //清除串口1发送中断请求位 } if (RI) //检测串口1接收中断 { RI = 0; //清除串口1接收中断请求位 } } void Uart1_Init(void) //19200bps@5.5296MHz { SCON = 0x50; //8位数据,可变波特率 AUXR &= 0xBF; //定时器时钟12T模式 AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //设置定时器模式 TL1 = 0xFA; //设置定时初始值 TH1 = 0xFF; //设置定时初始值 ET1 = 0; //禁止定时器中断 TR1 = 1; //定时器1开始计时 ES = 1; //使能串口1中断 } 复制代码
struct BUFF_DATA { uchar rptr; uchar wptr; char buff[256]; };复制代码
struct BUFF_DATA xdata uart_buff,xdata str_buff; #define BUFF_POP(x) x.buff[x.rptr++] #define BUFF_PUSH(x,d) x.buff[x.wptr++] = d #define BUFF_HAS_DATA(x) (x.rptr != x.wptr) #define BUFF_RESET(x) x.rptr=0;x.wptr=0复制代码
void Uart1_Isr(void) interrupt 4 { if (TI) { TI = 0; send_busy = 0; } if (RI) { RI = 0; BUFF_PUSH(uart_buff,SBUF); recv_timeout = 5; } }复制代码
void Uart1_Init(void) //19200bps@5.5296MHz { SCON = 0x50; //8位数据,可变波特率 AUXR &= 0xBF; //定时器时钟12T模式 AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //设置定时器模式 TL1 = 0xFA; //设置定时初始值 TH1 = 0xFF; //设置定时初始值 ET1 = 0; //禁止定时器中断 TR1 = 1; //定时器1开始计时 ES = 1; //使能串口1中断 EA = 1; send_busy = 0; BUFF_RESET(uart_buff); } 复制代码
void UartSend(char dat) { while(send_busy); send_busy = 1; SBUF = dat; } void UartSendStr(char *p) { while(*p) UartSend(*p++); }复制代码
while(1) { if(recv_timeout>0) { BUFF_RESET(str_buff); while(recv_timeout>0) { while(BUFF_HAS_DATA(uart_buff)) { tmp = BUFF_POP(uart_buff); BUFF_PUSH(str_buff,tmp); } recv_timeout--; Delay1ms(); } BUFF_PUSH(str_buff,0); DealString(str_buff.buff); } /*if(BUFF_HAS_DATA(uart_buff)) { UartSend(BUFF_POP(uart_buff)); }*/ }复制代码
void DealString(char *p) { if(strcmp(p,"hello") == 0) { UartSendStr("world!"); } else if(strcmp(p,"reboot") == 0) { Delay_ms(2000); IAP_CONTR = 0x60; } else { UartSendStr(p); } }复制代码
本版积分规则 发表回复 回帖后跳转到最后一页
|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )
GMT+8, 2025-8-25 22:54 , Processed in 0.129960 second(s), 91 queries .
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.