首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

单片机接受串口的数据解决方法

2013-11-16 
单片机接受串口的数据大家好,单片机接受串口的数据!单片机接受串口的数据,接受字符超过14个,则会不停的产

单片机接受串口的数据
大家好,单片机接受串口的数据!
单片机接受串口的数据,接受字符超过14个,则会不停的产生串口中断。反复接受字符,单步跟踪可以接受完14个字符,如果直接运行就全部乱了,很是着急。
如果小于14个则可以的,换了一块板子是可以的,但是有3块板子都是不行的,估计不是板子问题。
哪位前辈可遇到类似的问题,谢谢指点下! 单片机接受串口
[解决办法]
调试可以,正常运行不可以,说明中间有延时了就可以了,你看看程序是不是接收部分时间过长或者过短呢
[解决办法]
51串口例程

标签:51串口
发送程序

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
   for(j=0;j<112;j++);
}   

void init()
{

TMOD= 0X20;   //T1 方式2 ,8位   自动重装  
TH1=0Xfd;
TL1=0Xfd;    //9600
TR1=1;    // 定时器1启动

//SCON= 0X40;   // 串口工作模式 1
SM0=0; // 设置串口的工作模式
SM1=1;     //方式1


REN=0;    // 不允许串口接收数据


//ES=1; // 串口中断应许
//EA=1;   // 开启中断

}

void uart_sendB(uchar d)
{

SBUF=d;
while(!TI);

TI=0;
}
void uart_sendS(uchar *str)
{
while(*str)
{
   uart_sendB(*str) ;
   str++;
   delay(1);
}
}
void main()
{

   init();

 
//uart_sendB('S');
uart_sendS("XXXXXXXXXXXaaa@@@@@@@@@@ ");

//uart_sendB(0x0d);    //换行
//uart_sendB(0x0a);


while(1);

}

========================================================================

========================================================================

========================================================================

接收程序

#include <reg52.h>
#include "1602.h"

#define uchar unsigned char
#define uint unsigned int

uchar BUF[30],i=0;

void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
   for(j=0;j<112;j++);
}   

void init_uart()
{

TMOD= 0X20;   //T1 方式2 ,8位   自动重装
TH1=0Xfd;
TL1=0Xfd;    //9600
TR1=1;     // 定时器1启动


//SCON= 0X40;   // 串口工作模式 1
SM0=0; // 设置串口的工作模式
SM1=1;     //方式1
//SM2 = 1;   //;收到有效的停止位时才将RI置1yh

REN=1;    // 允许串口接收数据
ES=1;    // 串口中断应许
//RI=0;
EA=1;   // 开启中断
}

void uart_sendB(uchar d)
{

SBUF=d;
while(!TI);

TI=0;
}
void uart_sendS(uchar *str)
{
while(*str)
{
   uart_sendB(*str) ;
   str++;
   delay(1);
}
}

void main()
{

   init_uart();
init_1602();

LCD_write_string(0,0,"LYQ"); //列x=0-15,行y=0,1
BUF[0]='\0';
RI=0;

   while(1)
{
   LCD_write_string(0,1,BUF);
}
 
}
void uart_rx(void) interrupt 4 //using 3
{
   EA=0;
   if(RI)
{
    //RI=0;
    BUF[i++]=SBUF;
   //uart_sendB(BUF[i]);
   //LCD_write_char(12,1,'i');

 
}
EA=1;
}

[解决办法]
 while(1)
{
   LCD_write_string(0,1,BUF);
}

你这样写,屏幕上当然会显示abc2345555555555....
[解决办法]
是否中断标志没有清除?

[解决办法]
abc2345555555555....,感觉存放数据用的index没有清零,一直写下去了,这个只有你自己一步一步调试了
[解决办法]
引用:
BUF[0]='\0';
RI=0;

   while(1)
{
   LCD_write_string(0,1,BUF);
}
 
}
void uart_rx(void) interrupt 4 //using 3
{
   EA=0;
   if(RI)
{
    //RI=0;
    BUF[i++]=SBUF;
   //uart_sendB(BUF[i]);
   //LCD_write_char(12,1,'i');

 
}
EA=1;
}[/code]


注意这里,你虽然初始化时给BUF写了个\0进去,接收中断中收到新数据时却没有写这个字符串结束标志。这样你的LCD_write一定会跑飞出去。可以在BUF[i++]=SBUF;后面加一句BUF[i]=0;
当然这样缓冲区写满时还是有问题,可以再加个边界检查 if(i>=28) i=0;
另外delay程序里也用了i,重复命名容易混淆,可以改个名字

热点排行