各位大虾,最近在调单片机用串口和上位机进行通信,用串口调试助手发现有个奇怪的现象,特在此寻求解释。在没有打开串口中断或打开了串口中断但是没写串口中断函数时,发送到串口调试工具上的数据会多出一位,和要发送的数据的第一位是一样的。如发送的数据为01 02 03 04,但是接收的数据为01 01 02 03 04
这是我写的程序:
#include <reg52.h>
#include <string.h>
#include "LED.h" //此库函数里有extern uchar Close_LED[5]={0x01,0xc4,0x01,0x01,0xaa};
#define uchar unsigned char
#define uint unsigned int
void Init_Serial();
void Send_Char(uchar dat);
void Send_String(uchar *dat,uchar str_length);
void main()
{
Init_Serial();
while(1)
{
Send_String(Close_LED,5);
// Send_String("HelloWorld!",11); //不加串口中断服务程序,用这条语句的话,发送到串口数据只有H
while(1);
}
}
void E_Serial() interrupt 4 //串口中断服务程序
{
uchar dat;
if(RI)
{
RI = 0;
dat = SBUF;
Send_Char(dat);
}
}
void Init_Serial()
{
EA = 1; //开总中断
ES = 1; //开串口中断
TMOD = 0x20; //T1 自动重装8位定时器
SCON = 0x50; //8位UART,波特率可调,接受允许
PCON = 0x80; //波特率加倍
TH1 = 0xff;
TL1 = 0xff; //22.1184MHz,115200bps
TR1 = 1; //开定时器1
}
void Send_Char(uchar dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
void Send_String( uchar *str, uint str_length)
{
uint k=0 ;
do
{
Send_Char(*(str + k));
k++;
} while (k < str_length);
} |