单片机接收串口数据
4个回答
展开全部
你通过串口助手要接受字符串或一组数据需要在单片机端开辟一个缓冲区,否则可能丢失数据。
以下程序是较为通用的串口收发例程,开辟一个16字节的缓冲区,两个指针,一个存数指针,一个取数指针,两指针相等,证明没有新的接收数据。
#include<reg51.h>
#define uchar unsigned char
uchar buf[16],getptr,putptr;
void uart_isr() interrupt 4
{
if(RI)
{
RI=0;
buf[putptr]=SBUF;
putptr++;
putptr&=0x0f;
}
}
main()
{
TMOD=0x20;
SCON=0x50;
TH1=TL1=0xfd;
TR1=1;
ES=1;
EA=1;
putptr=0;
getptr=0;
while(1)
{
if(getptr!=putptr) //取数指针和存数指针如果不等
{
SBUF=buf[getptr];
getptr++;
getptr&=0x0f;
while(!TI);
TI=0;
}
}
}
以下程序是较为通用的串口收发例程,开辟一个16字节的缓冲区,两个指针,一个存数指针,一个取数指针,两指针相等,证明没有新的接收数据。
#include<reg51.h>
#define uchar unsigned char
uchar buf[16],getptr,putptr;
void uart_isr() interrupt 4
{
if(RI)
{
RI=0;
buf[putptr]=SBUF;
putptr++;
putptr&=0x0f;
}
}
main()
{
TMOD=0x20;
SCON=0x50;
TH1=TL1=0xfd;
TR1=1;
ES=1;
EA=1;
putptr=0;
getptr=0;
while(1)
{
if(getptr!=putptr) //取数指针和存数指针如果不等
{
SBUF=buf[getptr];
getptr++;
getptr&=0x0f;
while(!TI);
TI=0;
}
}
}
追问
用定时器2 也这样么?!
追答
T2初始化如下:
MOV T2CON,#34H
MOV SCON,#0C0H
MOV TH2,#0FFH
MOV TL2,#0DCH ;波特率=11059200/(2*16*(65536-RLDH,RLDL))
MOV RLDH,#0FFH
MOV RLDL,#0DCH ;波特率=11059200/(2*16*(65536-RLDH,RLDL)) 9600bps
展开全部
串口出现问题,大多是时钟不精确。请先检查。若正确,请检查接收程序中,是否有等到系统不忙的判定再接收数据。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是不是串口接收程序对接收结束的判断没处理好?
串口助手发送的是以字符格式发送的,不同的操作系统对字符串结束的标志形式不一样。
windows和linux对字符串的结束标志就不同,具体是怎么样的,我也记不清了,\n和\r的区别吧!
串口助手发送的是以字符格式发送的,不同的操作系统对字符串结束的标志形式不一样。
windows和linux对字符串的结束标志就不同,具体是怎么样的,我也记不清了,\n和\r的区别吧!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
接收串行数据是靠时序实现的,不是接收1的ascii码
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询