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
}
}
展开
 我来答
GUEL86
2013-03-20 · TA获得超过5855个赞
知道大有可为答主
回答量:5538
采纳率:86%
帮助的人:2730万
展开全部

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

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

ghost4063
2013-03-20 · TA获得超过6522个赞
知道大有可为答主
回答量:2940
采纳率:75%
帮助的人:2775万
展开全部
c只是个指针,你在使用之前要初始化,就是给它个具体的地址。c="xxxxxx"并不是初始化,而是向c指向的地址赋值,由于c没有值,所以赋值都是错的。
建议:
定义一个unsigned char datagroup[20];
c=datagroup;
然后再c="xxxxx"
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhxiufan
2013-03-20 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38385
国家科技进步奖

向TA提问 私信TA
展开全部
初始化时还需要加一行:
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
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式