STC12C5A60S2,串口1可以发字符串了,串口2不知道怎么回事只能发一个字符

这是我串口2的程序
#define S2RI 0x01
#define S2TI 0x02
#define S2RB8 0x04
#define S2TB8 0x08
#define S2REN 0x10
#define S2SM2 0x20
#define S2SM1 0x40
#define S2SM0 0x80
//初始化
void uart2_init(void) //[email protected]
{
AUXR &= 0xf7; //波特率不倍速
S2CON = 0x50; //8位数据,可变波特率
BRT = 0xDC; //设定独立波特率发生器重装值
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
AUXR |= 0x10; //启动独立波特率发生器
// AUXR1 &= 0x20; //选择P4口作为串口2
}
//串口2发送程序
uint8 uart2_send_string(uint8 const *dat)
{
uint8 *buf;

buf = dat;
S2CON &= ~S2TI; //发送前清发送中断
while (*buf != '\0')
{
S2BUF = *buf++; //填入发送缓冲区
while (S2CON &= ~S2TI); //等待发送完毕,TI=1 发送成功
S2CON &= ~S2TI; //发送完清发送中断
}
return (buf-dat); //返回发送字节
}

ASCII码在单片机中也是用16进制来表示的,只是解码后显示的是字符,你要是随便发一个字符,串口调试助手选择字符显示接收就可以显示一个字符出来(可能我们不认识这个字符)。发送一个字符串就是不停的发送直到发送完毕,51单片机有自己的串行发送端口P3.0和P3.1端口,但是它是一个字节一个字节发送的,发送完一个字节会产生一个中断(也可以用判断TI的方式判断是否发送完),中断响应后再次启动发送SBUF=0Xxx,就会自动连续的发送,再加上判断就可以控制发送的字节数。
串口初始化:
void uart_init()
{
TMOD=0x20;//定时器1,模式2
SCON=0x50;//串口通讯方式1
TH1=0xfd;//波特率9600
TL1=0xfd;
button=0;
delay(1);
TI=0;//发送中断标志位清零
RI=0;//接收中断标志位清零
TR1=1;//启动定时器1
EA=1; //使能全局中断
ES=1; //启动串口中断
}
}
void main()
{ P1=0xff;
uart_init() ;
while(1)
{
}
// 串行中断程序
void commIntProc() interrupt 4
{
if(TI)
{
TI = 0;
if(sendPosi < sendCount) //判断是否发送完成
{
sendPosi++; //发送一次计数器加一
SBUF = sendBuf[sendPosi];//启动发送
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-30
你好 请问你这个问题是怎么解决的?