|
楼主 |
发表于 2024-2-15 17:49:49
|
显示全部楼层
就是熊家余的源程序,主程序如下:
#include "sys.h"
#include "uart2.h"
void main(void)
{
u16 len;
sys_init();//系统初始化
uart2_init(115200);//初始化串口2
while(1)
{ if(uart2_rx_sta&UART2_PACKET_OK)//接受到了串口数据包
{len = uart2_rx_sta&UART2_PACKET_LEN;//得到串口数据包的长度,不包含"\r\n"或者'\n'结束符的长度
uart2_buf[len++] = 0;//在末尾添加2个空字符
uart2_buf[len++] = 0;
printf("T5L_C51:%s\r\n",uart2_buf);//把接受到的数据包加上"T5L_C51:"前缀后返还给发送者
sys_write_vp(0x2000,uart2_buf,len/2+1);//同时把数据包显示到界面上
uart2_rx_sta = 0;//清0代表处理掉了此串口包
}}}
初始化串口2
void uart2_init(u32 baud)
{
MUX_SEL |= 0x40;//bit6置1表示将uart2接口引出到P0.4和P0.5
P0MDOUT &= 0xCF;
P0MDOUT |= 0x10;//设置对应的IO口输出输入
ADCON = 0x80;//选择SREL0H作为波特率发生器
SCON0 = 0x50;//接受使能和模式设置
PCON &= 0x7F;//SMOD=0
//波特率设置,公式为:
//SMOD=0 SREL0H=1024-主频/(64*波特率),SMOD=1 SREL0H=1024-主频/(32*波特率)
baud = 1024-(u16)(3225600.0f/baud);
SREL0H = (baud>>8)&0xff;
SREL0L = baud&0xff;
#if(UART2_INT_EN)
ES0 = 1;//中断使能
EA = 1;
//xdata变量都得在函数中初始化
uart2_rx_sta = 0;
uart2_step = 0;
#else
ES0 = 0;
#endif
}
中断函数
void uart2_isr() interrupt 4
{
u8 res;
if(RI0)//是串口接受中断
{
RI0 = 0;//清除接受中断标志
res = SBUF0;//读取串口数据
if(uart2_rx_sta&UART2_PACKET_OK)//接收好的数据还未被处理
return;
if(uart2_step==0)//接受数据的过程
{
if(res=='\r')//如果接受到了"\r\n"结束标记,认为数据包接受完成
uart2_step = 1;//进入接受'\n'标记的过程
else if(res=='\n')//如果接受到了'\n'结束标记,也认为数据包接受完成
uart2_rx_sta |= UART2_PACKET_OK;//标记数据包接受完成
else//接受数据
{
if(uart2_rx_sta>=UART2_PACKET_MAX_LEN)
uart2_rx_sta = 0;//数据超量了,丢弃掉,重头开始接收
uart2_buf[uart2_rx_sta++] = res;//存储有效数据
}
}else if(uart2_step==1)//判断结束标记的过程
{
uart2_step = 0;
if(res=='\n')
uart2_rx_sta |= UART2_PACKET_OK;//标记数据包接受完成
else
uart2_rx_sta = 0;//'\r'的下一个字符不是'\n',认为接受错误,重头开始接收
}
}
}
#endif
|
|