本帖最后由 16777216 于 2013-6-11 20:46 编辑
我在做串口多字节发送的时候,pc给单片机发送好后,单片机不显示,复位之后才显示,一般这是哪里出问题了
问题更新 现在使用匠人的串口猎人的高级发码ok 但是用普通方式 或者是别的软件串口助手就需要重启单片机才能正确显示上次发送的数据?
这是源代码main.c
#include "uart.h"
#include "lcd1602.h"
#include "stc.h"
//extern unsigned char receive;
unsigned char hello[]={"ello,boy\n"};
void main()
{
Lcdstart();
UartInit();
Uart_send_char('h');
Uart_send_str(hello);
while(1)
{
if(uartflag)
{ ES=0;
LCDclear();
LCD_write_num(2,2,receive);
ES=1;
}
uartflag=0;
}
}
uart.c
#include "uart.h"
#include "stc.h"
//#include "lcd1602.h"
unsigned long int receive;
bit uartflag=0;
unsigned char recdata[6];
unsigned char cnt=0;
void Uartnit(void);
void Uart_send_char(unsigned char ch);
void Uart_send_str(unsigned char *str);
void interrupt_uart() interrupt 4 //中断接收 receive
{
if(TI)
{
TI = 0;
REN = 1;
}
if(RI)
{
RI = 0;
recdata[cnt]=SBUF;
cnt++;
if(recdata[0] == 0xaa)//0xaa为起始字节
{
if(cnt>=6)
{
//这里处理你的数据,以更新显示。
receive=recdata[1]+recdata[2]*10+recdata[3]*100+recdata[4]*1000+recdata[5]*10000;
uartflag=1;
cnt=0;
}
}else
{
cnt=0;//没有接收到字头,设置下一个可能为字头,
uartflag=0;
}
//receive= SBUF;
//uartflag=1;
}
}
/***********************************************************************/
/***************************通用函数***********************************/
void Uartinit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xFB; //独立波特率发生器时钟为Fosc/12,即12T
BRT = 0xFD; //设定独立波特率发生器重装值
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10; //启动独立波特率发生器
EA=1;
ES=1;
}
void Uart_send_char(unsigned char ch)
{
ES = 0;
TI = 0;
SBUF = ch;
while(!TI);
TI = 0;
ES = 1;
}
void Uart_send_str(unsigned char *str)
{
while(*str != 0)
{
Uart_send_char(*str);
str++;
}
}
|