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
}
} 展开
我希望的是单片机能够主动发送数据,我想用它通过串口控制其他模块。谢谢
附个人程序:
#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
}
} 展开
3个回答
展开全部
c只是个指针,你在使用之前要初始化,就是给它个具体的地址。c="xxxxxx"并不是初始化,而是向c指向的地址赋值,由于c没有值,所以赋值都是错的。
建议:
定义一个unsigned char datagroup[20];
c=datagroup;
然后再c="xxxxx"
建议:
定义一个unsigned char datagroup[20];
c=datagroup;
然后再c="xxxxx"
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
初始化时还需要加一行:
TL1=0xfd;
自动重装载你需要重装载的数据吧。
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
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询