打印

51单片机串口问题求解释

[复制链接]
1893|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

粉丝