串口发送和接收的数据不一致,求指教
#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才能接收到差不多正确的数据。
十有八九是时钟设置问题导致波特率不对。 开始发送时关闭中断,发送完打开中断,看看波特率有没有问题,没用过这款单片机,不是很了解 晶振频率是多少? 看一下晶振和波特率,先写一个固定的数据。0X55 或0XAA。 最好先验证接收,由电脑发数据,这时的波特率一定是准的。如果收不到数据。就仔细检查程序就是了。 本帖最后由 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);
MACK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
页:
[1]