51单片机串口问题求解释

[复制链接]
2724|3
 楼主| cbb0416 发表于 2011-7-27 10:06 | 显示全部楼层 |阅读模式
各位大虾,最近在调单片机用串口和上位机进行通信,用串口调试助手发现有个奇怪的现象,特在此寻求解释。在没有打开串口中断或打开了串口中断但是没写串口中断函数时,发送到串口调试工具上的数据会多出一位,和要发送的数据的第一位是一样的。如发送的数据为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);
}
原野之狼 发表于 2011-7-27 11:25 | 显示全部楼层
先确定好是用查询模式还是中断模式。
你这程序,把两种方式搅在一起了,竟让在中断服务程序里调用采用查询模式的Send_Char(dat),这不是一个好的做法。
 楼主| cbb0416 发表于 2011-7-27 12:00 | 显示全部楼层
感谢LS,你提到的以后一定注意。谁给分析下到底是什么原因造成上面的问题的呢?
lixiaoxu2meng 发表于 2011-7-28 15:05 | 显示全部楼层
看老半天 没看明白 lz 的意思  你能不能说清楚点  再有就是程序确实有点乱   你把程序整理一下说明什么问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

123

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部