STC52单片机与PC串口通信,我需要单片机主动向上位机发数据。

我自己整的程序能够发送数据,但是在电脑上用串口调试助手时,出现下面情况:下载完成不断电,串口调试助手立即就能接收数据,但是断电再上电就不行,非得向单片机发一个字符,调试助手才能接收到数据,请问是什么问题?如何解决?
我希望的是单片机能够主动发送数据,我想用它通过串口控制其他模块。谢谢

附个人程序:
#include <reg52.h>
#include <stdio.h>

unsigned char* c;

int length = 0; //记录单片机当前已接收字符串长度。

//串口初始化例程。
void init_uart()
{
SCON = 0x50; //SCON: mode 1, 8-bit UART, enable rcvr
TMOD = 0x20; //TMOD: timer 1, mode 2, 8-bit reload
TH1 = 0xFD; //TH1: reload value for 9600@11.0592MHz
TCON = 0x69;
TR1 = 1; //启动定时器1
ES = 1; //允许串口中断位
EA = 1; //允许总中断位
}

void SendOneChar(char c)
{
ES=0;
TI=0;
SBUF = c;
while(!TI);
TI=0;
ES = 1;
}

void SendString(char *st)
{
while(*st)
{
SendOneChar(*st++);
}
}

void uart_interrupt() interrupt 4
{
if(RI) //当SBUF接收到1个字符,硬件置RI为1。
{
RI = 0; //清RI
if(length < 4) //将接收到的字符缓存在c数组里。
{
c[length++] = SBUF;
}
}
if(TI) //当SBUF发送完1个字符后,由硬件置TI为1。
{
//字符发送中断处理
}
}

void main()
{
int i;
init_uart();
c = "adbs\r\n";
while(1)
{
for(i = 0; i < 4000; i++);//延迟一小段时间
SendString(c);//发送字符串到PC
}
}

程序没有问题,串口能够接收到 间隔连续的   adbs 。

是否 是串口调试 程序 设置问题。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-03-20
c只是个指针,你在使用之前要初始化,就是给它个具体的地址。c="xxxxxx"并不是初始化,而是向c指向的地址赋值,由于c没有值,所以赋值都是错的。
建议:
定义一个unsigned char datagroup[20];
c=datagroup;
然后再c="xxxxx"
第2个回答  2013-03-20
初始化时还需要加一行:
TL1=0xfd;
自动重装载你需要重装载的数据吧。追问

我试了一下,还是不行

追答

#include
#include

unsigned char* c;

int length = 0; //记录单片机当前已接收字符串长度。

//串口初始化例程。
void init_uart()
{
SCON = 0x50; //SCON: mode 1, 8-bit UART, enable rcvr
TMOD = 0x20; //TMOD: timer 1, mode 2, 8-bit reload
TH1 = 0xFD; //TH1: reload value for 9600@11.0592MHz
TL1=0xfd;
TR1 = 1; //启动定时器1
ES = 1; //允许串口中断位
EA = 1; //允许总中断位
}

void SendOneChar(char c)
{
ES=0;
TI=0;
SBUF = c;
while(!TI);
TI=0;
ES = 1;
}

void SendString(char *st)
{
while(*st)
{
SendOneChar(*st++);
}
}

void uart_interrupt() interrupt 4
{
if(RI) //当SBUF接收到1个字符,硬件置RI为1。
{
RI = 0; //清RI
if(length < 4) //将接收到的字符缓存在c数组里。
{
c[length++] = SBUF;
}
}
if(TI) //当SBUF发送完1个字符后,由硬件置TI为1。
{
TI=0; //字符发送中断处理
}
}

void main()
{
int i;
init_uart();
c = "adbs\r\n";
while(1)
{
for(i = 0; i < 4000; i++);//延迟一小段时间
SendString(c);//发送字符串到PC
}
}

追问

呵呵,不行啊。

相似回答