tragedy 发表于 2013-7-16 13:54:59

串口发送和接收的数据不一致,求指教

#include<p18f4520.h>
//#include"k18.h"
#define uint unsigned int
#define uchar unsigned char


/* send flag-----*/
int Txflag = 0;

int count400ms = 0;
char p = {       
                                        0x51,0x05,0x02,0x00,0x00,0x00,0x0D,0x0E,0x0F,
                                        0x52,0x04,0x02,0x00,0x00,0x00,0x0D,0x0c,0x1c,
                                        0x53,0x03,0x02,0x00,0x00,0x00,0x0D,0x1e,0x1f,
                                        0x54,0x02,0x02,0x00,0x00,0x00,0x0D,0x1d,0x2d
                           };
char (*q) = p;
void Port_init();
void Adc_init();
void Timer_init();
void Serial_Init();
void delaymsu(uint ms);

void delayms(uint ms)
{
        uchar i;
        while(ms--)
        {
                for(i = 0;i< 87;i++);
        }
}
void interrupt ISR(void)
{
       
        if(1 == INTCONbits.TMR0IF) /*---T0 interrupt or not*/
        {
                count400ms++;
                if(count400ms == 15000)
                {
                        Txflag = 1;
                        count400ms = 0;
                }
                INTCONbits.TMR0IF = 0;      /* clr interrupt flag for next interrupt*/
                TMR0L = 0X0D;                      /*-------reassign an initial value ----------*/
                TMR0H = 0xFF;
        }
}

int main()
{
//        k18_init();   
        Timer_init();
        Serial_Init();
        while(1)
        {
                if(1 == Txflag)
                {

                        for(q = p;q < &p;q++)
                        {

                                char *temp_ser;
                                {
                                        for(temp_ser = *q;temp_ser < &(*q);temp_ser++)
                                        {
                                                TXREG = *temp_ser;
                                                while(TXSTAbits.TRMT == 1);
                                                delayms(5);
                                        }
                                }
                        }
                        Txflag = 0;
                       
                }
        }
}

void Timer_init()
{
        INTCONbits.GIE = 1; /*-----set global int-------*/
        INTCONbits.PEIE = 1;
/*----T1 init---0.2ms interrupt-------------------------*/       
        INTCONbits.TMR0IE = 1;
        INTCONbits.TMR0IF = 0;/*------CLR FLAG in order to interrupt-------*/
        T0CON = 0X00;      /*-------prescale 1:2---------*/
       
        T0CONbits.TMR0ON =1;    /*----enable T0----*/
       
        TMR0L = 0X0D;
        TMR0H = 0xFF;

       
}
/*------串口初始化-------*/
void Serial_Init()
{
        RCSTAbits.SPEN = 1; /* 使能串口模式*/
        TXSTAbits.SYNC = 0; /* 设置为异步模式 */
        TXSTAbits.BRGH = 1; /* 高速模式 */
        SPBRG = 64; /* 波特率寄存器设置,波特率 = 9600*/
        RCSTAbits.CREN = 1; /* 使能接收*/
        TXSTAbits.TXEN = 1; /* 使能发送 */
}         // 波特率也出现问题,串口软件要38400才能接收到差不多正确的数据。

.titrwh 发表于 2013-7-16 15:34:48

十有八九是时钟设置问题导致波特率不对。                                                                                                   

lhaiyang1316 发表于 2013-7-17 21:13:45

开始发送时关闭中断,发送完打开中断,看看波特率有没有问题,没用过这款单片机,不是很了解

cn_x 发表于 2013-7-18 14:47:37

晶振频率是多少?

decoder 发表于 2013-7-18 21:33:16

看一下晶振和波特率,先写一个固定的数据。0X55 或0XAA。 最好先验证接收,由电脑发数据,这时的波特率一定是准的。如果收不到数据。就仔细检查程序就是了。   

tragedy 发表于 2013-7-19 09:39:21

本帖最后由 tragedy 于 2013-7-19 09:40 编辑

问题解决了。第一次搞也没啥经验,谢谢ls的各位
波特率配置错了,波特率选的是 pll enabled4*fosc的。
还有一个问题就是TXREG = *temp_ser;
         while(TXSTAbits.TRMT == 1);
    delayms(10);延时加长点
或者TXREG = *temp_ser;
      while(TXSTAbits.TRMT == 0);
                                                

yangjian_71 发表于 2013-8-7 16:59:10

MACK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
页: [1]
查看完整版本: 串口发送和接收的数据不一致,求指教