找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2894|回复: 11
打印 上一主题 下一主题
收起左侧

请教各位大虾们帮我看看这个程序到底问题在哪里?

[复制链接]
跳转到指定楼层
楼主
程序目的:单片机多机通信
功能:主机先发送地址码01给从机,从机收到地址后和自己的地址比较,若和自己的地址相同就返回1A表示应答,地址不同就继续等待地址。

本案例摘自51单片机应用开发范例大全第10章----单片机通信

现在的问题是每次用串口工具发送01时,分机返回的是1A, FF.  其中多了FF。  想了很多办法,就是没办法去掉这个FF,不知道是什么问题,请教一下大家。
源程序如下;
#include<11f02e.h>
#include<intrins.h>   /*伪定义*/
#define BUF_MAX_LEN 10   /*缓冲区的最大长度*/
#define ADDR_ACK    0x1A
#define DATA_ACK    0x2A
#define DATA_ERR    0x3A
sbit LEDR=P1^7;
unsigned char recv_buf[BUF_MAX_LEN+1];  /*函数声明*/
unsigned char recv_data_frame( void );  /*接收数据帧*/
void send_ack( unsigned char ack );     /*发送应答信息*/
void recv_addrframe( void );            /*接收地址帧*/
void serial_init( void );               /*串口初始化*/
/*********主程序中serial_init()*********/
void main( void )
{
    unsigned char recv_tmp=0;
    serial_init();
    while(1)
    {
        recv_addrframe();        /*接收主机发送的地址帧*/
        send_ack( ADDR_ACK );    /*发送地址收到应答*/
    if( recv_data_frame() == DATA_ACK )
        {
         send_ack( DATA_ACK );
        }
    else if (recv_data_frame == DATA_ERR )
        {
         send_ack( DATA_ERR );
     }
    }
}
/*********接收数据帧函数********/
unsigned char recv_data_frame( void )
{
    unsigned char i;
    unsigned char check_sum=0;
    SM2= 0;
    for( i=0;i<BUF_MAX_LEN+1;i++)   /* 接收数据帧,注意最后一个字节为校验字节 */
    {
        while( !RI );
  if( RB8 ) return 0;
        recv_buf[i] = SBUF;
    }
    for( i=0;i<BUF_MAX_LEN;i++)   /* 由接收到的数据计算校验和 */
    {
        check_sum += recv_buf[i];
    }
    if( recv_buf[ BUF_MAX_LEN+1]==check_sum )
    {
        return DATA_ACK;     /* 校验和正确则返回数据正确 */
    }
    else
    {
        return DATA_ERR;     /*否则返回错误*/
    }
}
/*********函数void send_ack()********/
void send_ack( unsigned char ack )
{
    TI  = 0;
    TB8 = 0;
    SBUF= ack;
    while( !TI );
    TI = 0;
}
/*********接收地址帧函数*********/
void recv_addrframe( void )
{
    unsigned char client_addr,recv_tmp;
    client_addr = 0x01;
    recv_tmp    = 0 ;
    SM2 = 1;    /*只接收地址帧*/
    while( recv_tmp != client_addr )
    {
        RI = 0;
        while( !RI );   /*等待接收地址数据*/
        RI = 0;
        recv_tmp = SBUF;
    }
}
/*********串行口初始化函数*********/
void serial_init( void )
{
    TMOD= 0x20 ;
    TH1 = 0xFD ;
    TL1 = 0xFD ;
    EA  = 0;
    ET0 = 0;
    ES = 0;
    SCON= 0xD0 ;
    PCON= 0x00 ;
    TR1 =1;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:67992 发表于 2014-12-6 20:32 | 只看该作者
晶振用11.0592,波特率9600不会有你所说的问题。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:12238 发表于 2014-12-6 22:39 | 只看该作者
dgahz 发表于 2014-12-6 20:32
晶振用11.0592,波特率9600不会有你所说的问题。

晶振没错是11.0592,程序设定的波特率也是9600,程序是书上的,我原封未动下载到单片机里面的,我用的单片机是11F02E
回复

使用道具 举报

地板
ID:67992 发表于 2014-12-7 12:28 | 只看该作者
我用的是STC89C52RC,我只改了头文件,下载到开发板上,打开串口,发送01,返回1A,没有FF.如返回不对,肯定通信有问题,一是波特率不准,或是线太长接触不良。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:67992 发表于 2014-12-7 15:27 | 只看该作者

回复

使用道具 举报

6#
ID:67992 发表于 2014-12-7 15:31 | 只看该作者

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:12238 发表于 2014-12-15 10:01 | 只看该作者
版主,好神奇啊,我用的串口是MAX232转单片机,出现这个返回多了一个FF的现象,现在我换了一个PL2303芯片的USB转232,直接和单片机通信就没有这个问题了,难道是MAX232有干扰???
回复

使用道具 举报

8#
ID:67992 发表于 2014-12-15 10:26 | 只看该作者
说明通讯不畅,和程序无关。我们在这论坛主要学编程,硬件是另一门课,很少讨论。
回复

使用道具 举报

9#
ID:12238 发表于 2014-12-15 10:29 | 只看该作者
dgahz 发表于 2014-12-15 10:26
说明通讯不畅,和程序无关。我们在这论坛主要学编程,硬件是另一门课,很少讨论。

版主,我加你Q了啊,你怎么不通过啊?想向你学习一下编程啊,我之前一直都是汇编,最近才学C。
回复

使用道具 举报

10#
ID:67992 发表于 2014-12-15 11:01 | 只看该作者
我这边没收到你加Q请求。
回复

使用道具 举报

11#
ID:68804 发表于 2014-12-15 11:13 | 只看该作者
学习了
回复

使用道具 举报

12#
ID:12238 发表于 2014-12-20 17:47 | 只看该作者
dgahz 发表于 2014-12-15 11:01
我这边没收到你加Q请求。

已经加了哈,谢谢
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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