51单片机串口通信,得到乱码 100
程序如下:#include<reg52.h>#include<string.h>#defineucharunsignedchar#defineuintunsignedin...
程序如下:
#include<reg52.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
#define BufferLength 32
uchar Buffer[BufferLength]={0};
bit flag=1;
void SendByte(uchar byte)
{
SBUF=byte;
while(TI==0);
TI=0;
}
void SendString(uchar *pString)
{
uint i,length;
length=strlen(pString);//#include<string.h>
for(i=0;i<length;i++)
{
SendByte(*(pString+i));
}
}
void delay(uint a)
{
uint i,j;
for(i=0;i<a;i++)
for(j=0;j<110;j++);
}
void main()
{
uint i;
TMOD=0x20; //使用八位重载定时器1
SCON=0x50; //允许接受,串行工作模式1 ,10 位异步,定
TL1=0xFD; //11.0592MHz 晶振下,波特率9600
TH1=0xFD; //11.0592MHz 晶振下,波特率9600
TR1=1; //使能定时器1
EA=1; //允许总中断
ES=1; //允许串行中断
while(1)
{
SendByte('A');
while(flag);
flag=1;
for(i=0;i<BufferLength;i++)//象征性LED显示。
{
P2=Buffer[i];
delay(500);
}
SendByte('a');
}
}
void SerialReceive() interrupt 4
{
static uchar i=0;
if(RI)
{
RI=0;
Buffer[i]=SBUF;
i++;
if(i==BufferLength)i=0;
flag=0;//成功接收到数据标志。
}
}
打开超级终端 得到的是?号 而不是A,用MATLAB查看 返回的也不是对应的ASCII码 展开
#include<reg52.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
#define BufferLength 32
uchar Buffer[BufferLength]={0};
bit flag=1;
void SendByte(uchar byte)
{
SBUF=byte;
while(TI==0);
TI=0;
}
void SendString(uchar *pString)
{
uint i,length;
length=strlen(pString);//#include<string.h>
for(i=0;i<length;i++)
{
SendByte(*(pString+i));
}
}
void delay(uint a)
{
uint i,j;
for(i=0;i<a;i++)
for(j=0;j<110;j++);
}
void main()
{
uint i;
TMOD=0x20; //使用八位重载定时器1
SCON=0x50; //允许接受,串行工作模式1 ,10 位异步,定
TL1=0xFD; //11.0592MHz 晶振下,波特率9600
TH1=0xFD; //11.0592MHz 晶振下,波特率9600
TR1=1; //使能定时器1
EA=1; //允许总中断
ES=1; //允许串行中断
while(1)
{
SendByte('A');
while(flag);
flag=1;
for(i=0;i<BufferLength;i++)//象征性LED显示。
{
P2=Buffer[i];
delay(500);
}
SendByte('a');
}
}
void SerialReceive() interrupt 4
{
static uchar i=0;
if(RI)
{
RI=0;
Buffer[i]=SBUF;
i++;
if(i==BufferLength)i=0;
flag=0;//成功接收到数据标志。
}
}
打开超级终端 得到的是?号 而不是A,用MATLAB查看 返回的也不是对应的ASCII码 展开
4个回答
展开全部
void SendByte(uchar byte)
{
SBUF=byte;
// while(TI==0); //去掉这命令,这个命令的 原意是什么???
// TI=0; // 把 清TI的命令放在中断程式那,这里清TI 会让发送中断乱的了
}
void SerialReceive() interrupt 4
{
static uchar i=0;
if(RI)
{
RI=0;
Buffer[i]=SBUF;
i++;
if(i==BufferLength)i=0;
flag=0;//成功接收到数据标志。
}
//这里加TI 的程式
if(TI)
{
TI=0;
// 发送DATA 程式,
}
}
{
SBUF=byte;
// while(TI==0); //去掉这命令,这个命令的 原意是什么???
// TI=0; // 把 清TI的命令放在中断程式那,这里清TI 会让发送中断乱的了
}
void SerialReceive() interrupt 4
{
static uchar i=0;
if(RI)
{
RI=0;
Buffer[i]=SBUF;
i++;
if(i==BufferLength)i=0;
flag=0;//成功接收到数据标志。
}
//这里加TI 的程式
if(TI)
{
TI=0;
// 发送DATA 程式,
}
}
追问
我的中断是用来接收的,发送没用中断,while(TI==0)是等待发送完成
追答
你用示波器看了你单片机发的DATA 波形是否对的?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.发送函数调用过快(两次发之间调用延时)
2.上位机关键效验问题(一般选择无效验)
3.波特率不对
4.在中断中加入串口发送 会出现奇怪的问题
自查
2.上位机关键效验问题(一般选择无效验)
3.波特率不对
4.在中断中加入串口发送 会出现奇怪的问题
自查
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
程序没毛病,我觉得可能是你单片机与PC机波特率设置不一致造成的,单片机为9600,超级终端缺省为2400
追问
我超级终端也设置成9600了,特别留意过的。
追答
为了验证,我建议你用串口助手试试,比超级终端功能强些。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
硬件电路有没问题啊,有没有虚焊啊?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询