‘壹’ 单片机串口通信问题,电脑接收到的数据出现错误项。
晶振如果是12MHz,波特率设置为9600的话误码率有点大,将波特率放低一点试一试(如TL1=0xf3; TH1=0xf3 即波特率2400)!
‘贰’ 51单片机的串口接收数据并分析
可惜我不能贴图
12864去电子城买时找专做显示屏的柜台买。
只要是专业生产LCD的公司,都会配有c语言的驱动程序(通常是51的程序),还有电子档LCD说明书
买来稍微修改就可以用啦
‘叁’ 单片机串口如何接收
在主程序中对接收到的数据串进行处理,查找帧头、提取有效数据、进行业务判断。
首先,要知道中断应当尽量简洁,所以中断里面只做数据接收和下标移动。
其次,要知道每帧的最大长度。帧长度要是毫无限制那缓冲区就不好开了,得采用适用性更强的缓冲技术,这里就不提了。举例假定数据量最多10字节,则最长帧为13字节,可开辟16字节缓冲区。
再次,要知道通信协议是怎么样的,传输速率如何(与单片机处理能力相比),每帧的数据之间有多少间隔,帧与帧之间有多少间隔。
间隔太短的话需要增加许多额外的处理,例如帧头识别、帧分割,必要时又得用较大容量的循环缓冲区……这里也不提了。举例假定帧间有足够多的间隔时间。
‘肆’ 单片机接收串口数据
你通过串口助手要接受字符串或一组数据需要在单片机端开辟一个缓冲区,否则可能丢失数据。
以下程序是较为通用的串口收发例程,开辟一个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;
}
}
}