打印
[PIC®/AVR®/dsPIC®产品]

自己做的一个uart异步通信下位机接收程序,就是运行不出来

[复制链接]
1935|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaozhe2012|  楼主 | 2013-9-6 15:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实在检查不出来到底是哪里错误了,天天被老师训哦,望哪位大侠帮我看看,不胜感激哦!
    程序使用pic16f877:#include<pic.h>
#define uchar unsigned char
#define uint  unsigned int
volatile int RecieveBuffer[7];//用来存放数据
volatile int Rxi=0;//用于接收计数
volatile int b=0;//用于累加和校验
volatile int verrify=0;//保存校验结果
volatile int c;
//__PROG_CONFIG(0X3F71);//bit13-12程序保护位-11无保护,bit11在线调试使能1使能,bit10保留位-系统自动置1,
//bit9flash程序存储器写使能-1可以通过EECON写入程序,bit8数据代码保护1不保护,bit7低电压在线编程0禁止,
//bit6掉电复位0禁止??,bit5-4与12-13相同为11,bit3上电定时器使能1禁止,bit2看门狗0禁止,
//bit1-0晶振选择01XT标准震荡;最终配置子0x0011 1111 0011 1001;即0x3F39
void init();
void interrupt com();
int addnumber();
void Send();
void finish();
void main()
{   int c=0;
        init();
    while(1)
   {c++;
    if(Rxi==7)
      { RCIE=0;
        addnumber();
        Send();
        finish();
      }
    }
}
void init()//初始化
{  
        TRISC=0x80;//portc 1000 0000;7输入pin26,6输出pin25,其余端口置为输出
        TXSTA=0x24; //0010 0100发送寄存器初始化
        RCSTA=0x90;//1001 0000接受寄存器初始化
        SPBRG=25;//设定9600baud
        GIE=1;//开总中断
        PEIE=1;//开外设中断
        RCIE=1;//开接收终端
    TXIE=1;//开发送中断
}
void interrupt com()//中断接收;数据累加校验;校验结果数据输出
{
   if(RCIE&&RCIF)
    { RecieveBuffer[Rxi]=RCREG;
      Rxi++;//接收后自增
      RCIF=0;//清0中断标志位
     /* if(Rxi==7)
      { RCIE=0;//禁止接收,可能关掉中断
      }*/
    }
}
int addnumber()
{
   int i=0;
  for(i=0;i<=5;i++)
{
  b+=RecieveBuffer[i];
}
  i=0;
  verrify=b;
return verrify;
}

void Send()
{ if(verrify==RecieveBuffer[6])
   { TXREG=1;
   }
   else
   { TXREG=4;
   }
   while(!TRMT);//保证发送完毕
  
}
void finish()
{ Rxi=0; //重新计数
  RCIE=1;//重新开启接收中断
}
想要完成的功能是从上位机接收7个数据,并校验,如果正确给上位机发1,否则发4!自己检查发现程序根本不在我主程序的while(1)循环体内循环,单步运行后,pc跑飞。。。实在是无奈了哦!
沙发
xiaozhe2012|  楼主 | 2013-9-6 15:20 | 只看该作者
求指导哦,求爱的奉献

使用特权

评论回复
板凳
NE5532| | 2013-9-6 16:34 | 只看该作者
先调发送,再调接收。

使用特权

评论回复
地板
liudanwei| | 2013-9-6 17:07 | 只看该作者
同意楼上的说法,建议接收没调通先不要加发送,

使用特权

评论回复
5
gaorongxing| | 2013-9-6 17:08 | 只看该作者
本帖最后由 gaorongxing 于 2013-9-6 17:09 编辑

没记错的话,开发送使能是TXEN,而不是TXIE

使用特权

评论回复
6
yewuyi| | 2013-9-6 17:53 | 只看该作者
收不到通信数据的可能太多了,至少有如下可能:
1、波特率对不上
2、收发的IO口方向设置不正确
3、通信电路硬件故障
4、收发中断没有打开
5、其他收发代码有问题,将通信数据覆盖了
6、没有真实的发出数据
7.。。。

使用特权

评论回复
7
zdhlixiang2006| | 2013-9-6 18:36 | 只看该作者
这排版。。。屌爆了

使用特权

评论回复
8
yklstudent| | 2013-9-6 21:22 | 只看该作者
不说啥,直接上程序
楼主直接拿去用好了
#include <htc.h>

// CONFIG
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config CP = OFF         // FLASH Program Memory Code Protection bits (Code protection off)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = ON         // Low Voltage In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config CPD = OFF        // Data EE Memory Code Protection (Code Protection off)
#pragma config WRT = ON         // FLASH Program Memory Write Enable (Unprotected program memory may be written to by EECON control)

#define uchar unsigned char
#define uint  unsigned int

#ifndef _XTAL_FREQ               
#define _XTAL_FREQ                        4000000UL
#endif

/* 此处声明必须不能用,否则出错 */?
//void interrupt ISR(void);

extern void Init_Sys(void);
extern void Init_Port(void);
extern void Init_Usart(void);
extern void Usart_SendByte(uchar send_dat);

uchar RecvBuffer[7];
uchar RecvPtr = 0;
uchar Verity = 0;

void main(void)
{
        uchar i;
        Init_Sys();
        while(1)
        {
/* 此处程序用于测试MCU有没有工作用 */
#if 0
                Usart_SendByte(0x55);
                PORTD = 0x55;
                __delay_ms(200);
                PORTD = 0xaa;
                __delay_ms(200);
#endif
                if (RecvPtr >= 7)
                {
                        RCIE = 0;                //禁止接受中断
                        Verity = 0;
                        for (i=0; i<6; i++)
                        {
                                Verity += RecvBuffer[i];
                        }
                        if (RecvBuffer[6] == Verity)
                        {
                                Usart_SendByte(0x01);
                        }
                        else
                        {
                                Usart_SendByte(0x04);
                        }
                        RecvPtr = 0;
                        RCIE = 1;                //开启接受中断
                }
        }
}

void interrupt ISR(void)
{
    if (RCIF && RCIE)
    {
        RCIF = 0;
                RecvBuffer[RecvPtr] = RCREG;
                RecvPtr ++;
    }
}

void Init_Sys(void)
{
        Init_Port();
        Init_Usart();
}

void Init_Port(void)
{
        PORTD = 0xFF;
        TRISD = 0x00;
}

void Init_Usart(void)
{
        TRISC = 0x80;
        TXSTA = 0x24;
        RCSTA = 0x90;
        SPBRG = 25;
        RCIF = 0;
        RCIE = 1;
        TXIF = 0;
        /* 此处发送中断不能开启,否则中断函数中必须要发送中断处理 */
        //TXIE = 1;
        PEIE = 1;
        GIE = 1;
}

void Usart_SendByte(uchar send_dat)
{
        TXREG = send_dat;
        while(!TXIF);
        TXIF = 0;
}

使用特权

评论回复
9
NE5532| | 2013-9-7 11:33 | 只看该作者
yklstudent 发表于 2013-9-6 21:22
不说啥,直接上程序
楼主直接拿去用好了
#include

只讲方法,不帮调程序。先调发送,再调接收,楼主自己想一下道理就明白了。

使用特权

评论回复
10
xiaozhe2012|  楼主 | 2013-9-7 16:13 | 只看该作者
yklstudent 发表于 2013-9-6 21:22
不说啥,直接上程序
楼主直接拿去用好了
#include

先谢谢了哈,大神,我回去试试!我的是pic16f877哦,不知行不行!嘿嘿,有问题了再请教大神了哦!

使用特权

评论回复
11
yklstudent| | 2013-9-7 18:21 | 只看该作者
NE5532 发表于 2013-9-7 11:33
只讲方法,不帮调程序。先调发送,再调接收,楼主自己想一下道理就明白了。 ...

有空就帮楼主写了一个而已 呵呵

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xiaozhe2012 + 1 很给力!
12
xiaozhe2012|  楼主 | 2013-9-10 16:39 | 只看该作者
结不了贴。。。

使用特权

评论回复
13
yewuyi| | 2013-9-11 13:44 | 只看该作者
xiaozhe2012 发表于 2013-9-10 16:39
结不了贴。。。

在首贴,点我要结贴,然后针对各个跟帖打分,打分总额必须和首贴悬赏分一致,然后点结贴给分击可。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

25

帖子

0

粉丝