OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4287|回复: 4

串口 无法收到数据,求大侠相助!

[复制链接]

60

主题

225

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2013-7-27
在线时间
4 小时
发表于 2014-10-11 09:35:08 | 显示全部楼层 |阅读模式
5金钱
单字节收发正常,串口助手也能收到原数据。改为多字节发送数据时,怎么发都收不到数据,实在找不到原因,希望各位大侠帮帮忙,万分感谢!

51 串口 (单字符OK).zip

18.35 KB, 下载次数: 161

最佳答案

查看完整内容[请看2#楼]

回复【4楼】1201yuge: ---------------------------------  问题已经解决了,是初始化没有成功。现在能实现单字节收发,多字节也可以。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

60

主题

225

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2013-7-27
在线时间
4 小时
 楼主| 发表于 2014-10-11 09:35:09 | 显示全部楼层
回复【4楼】1201yuge:
---------------------------------


 问题已经解决了,是初始化没有成功。现在能实现单字节收发,多字节也可以。
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1679
金钱
1679
注册时间
2014-2-25
在线时间
229 小时
发表于 2014-10-11 11:19:38 | 显示全部楼层
我看了一下你的程序,是没有问题的。收不到数据,看看是不是你的晶振跟你现在所设置的波特率不配对,误差太大引起的。你那里配置的是FD,对应的晶振是11.0592M的,如果你的是12M话,可以先尝试一下其他的波特率。例如1200的波特率对应12M的晶振,传输误差就很小,配置是TL1 = 0xe6;
TH1 = 0xe6;
回复

使用道具 举报

60

主题

225

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2013-7-27
在线时间
4 小时
 楼主| 发表于 2014-10-11 11:32:59 | 显示全部楼层
回复【2楼】1201yuge:
---------------------------------
这个板子,无法下载了。我现在换了一个单片机型号,程序功能和上面,波特率和晶振也都对着,可是还是收不到数据,麻烦你再看一下。


#include<stdio.h>
#include<stc15f2k60s2.h>
#include<intrins.h>

#define  uchar unsigned char
#define uint  unsigned int




uchar Rxindex;
uchar Rx_SBUF;
uchar xdata RecieveData[10];
bit bdata Re_Flag;

void Receive_data();

uchar uc_flag_1 = 0;


void UartInit(void) //9600bps@11.0592MHz
{

SCON = 0x50; //8位数据,可变波特率
AUXR = 0x40; //定时器1时钟为Fosc,即1T
TMOD = 0x00; //设定定时器1为16位自动重装方式
TL1 = 0xE0; //设定定时初值
TH1 = 0xFE; //设定定时初值

TR1 = 1; //启动定时器1
ES = 1;


}


void send_dat(uchar dat)
{

SBUF = dat;
while(TI == 0);
TI = 0;
}


void main()
{    

UartInit();

    EA = 1;

while(1)


if(uc_flag_1)  // 每收到一个字节
{

ES = 0; //关闭总中断

uc_flag_1 = 0;  // 清除接收标志
send_dat(0x11);

ES = 1;// 开启总中断

}


if(Re_Flag )   // 正确接收到数据  发送0x88
{
ES = 0; //关闭总中断

Re_Flag = 0;  // 清除接收标志
send_dat(0x88);

ES = 1;// 开启总中断
}

}
}


// 串口1中断服务程序   测试
void uart0() interrupt 4  using 1
{
if( RI== 1)
{
RI = 0;
Rx_SBUF = SBUF;
uc_flag_1 = 1;

Receive_data();
}
}  


void Receive_data()
{
if(Rx_SBUF==0xAA)            // 数据长度为8个字节
Rxindex=0; 
          
RecieveData[Rxindex++]=Rx_SBUF;      
     
if(Rxindex==8)  
{

Rxindex =0x00;
// 自定义协议格式为:AA, xx,xx,xx, xx,xx,xx, 55
if((RecieveData[0]==0XAA) && (RecieveData[7]==0X55))
{
Re_Flag=1;  //  数据头和数据尾均正确
}

}                                                            
}
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1679
金钱
1679
注册时间
2014-2-25
在线时间
229 小时
发表于 2014-10-12 11:12:53 | 显示全部楼层
你现在的程序能实现单个数据的发送接受吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 04:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表