jason_zhou 发表于 2007-8-2 13:53:23

老师好,问下关于串口数据发送问题,为何程序里数据发送不正确?

数据发送应该为55 02 20 03 61 62 63 00 00 55

可是数据里,20 03总是发送不对

请老师帮忙看下,谢谢

程序如下:

#include <iom16v.h>

#include <macros.h>



#define uchar unsigned char

#define uintunsigned int

#define fosc 8000000 //晶振8MHZ

#define baud 9600       //波特率

#define UARTRL (fosc/16/(baud+1))%256;

#define UARTRH (fosc/16/(baud+1))/256;



////////////////////

//   公用变量区

////////////////////

volatile uchar i,j,k;



volatile struct

{

   uchar out_time;    //发送超时

   uchar pt;

   uchar ptx;

   uchar buf;

}txd;



volatile struct

{

   uchar pt;

   uchar ptx;

   uchar buf;

}rxd;



typedef struct{

        uchar head;

        uchar frameLen;

        uchar function;

        uchar dataLen;

        uchar *Data;

        uchar crc;

        uchar end;

}COMMUNICATION_STRUCT;



unsigned char rx_ok;

unsigned char tx_ok;



volatile COMMUNICATION_STRUCT Commu_Protocol;



////////////////////

//   子函数区

////////////////////



void port_init(void)

{

PORTA = 0x00;

DDRA= 0x00;

PORTB = 0x00;

DDRB= 0x02;

PORTC = 0x00;

DDRC= 0x01;

PORTD = 0x00;

DDRD= 0x00;

}



void uart0_init(void)

{

UCSRB = 0x00; //disable while setting baud rate

UCSRA = 0x00;

UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位

UBRRL = 0x33; //set baud rate lo

UBRRH = 0x00; //set baud rate hi

UCSRB = 0xD8;

rxd.pt= 0;

rx_ok = 0;

}



#pragma interrupt_handler uart0_rx_isr:12

void uart0_rx_isr(void)

{    uchar i,j;

   i=UDR;

       rxd.buf=i;

   rxd.pt++;

   if(rxd.pt>=8)            //接收8个数据

      {

           rx_ok=0x55;

           PORTB=~PORTB;

      }

}



#pragma interrupt_handler uart0_tx_isr:14

void uart0_tx_isr(void)

{

}





void init_devices(void)

{

CLI();



port_init();

uart0_init();



SEI();

}





//发送采用查询方式

void put_one(uchar c)

{

       

    UDR=c;

    while(!(UCSRA & (1<<UDRE)));

}



//发送字符串

void put_s(uchar *ptr)

{

    while (*ptr)

    {

      put_one(*ptr++);

    }

}

void USART_Transmit(uchar *data, uchar len)

{

       

        while(len --) {

               

                while(!(UCSRA & (1 << UDRE)));

                UDR = *(data++);                       

        }                

       

}

void USART_Frame_Transmit(COMMUNICATION_STRUCT sendFrame)

{

    uchar *dataTmp;

       

        //uchar dataTmp;

        uchar i;

        uchar tmp;



        dataTmp = (uchar *)malloc(7 + sendFrame.dataLen);

        dataTmp = 0x55;

        dataTmp = sendFrame.frameLen;

        dataTmp = sendFrame.function;

        dataTmp = sendFrame.dataLen;

        memcpy(dataTmp + 4, sendFrame.Data, sendFrame.dataLen);

        dataTmp = (uchar)(sendFrame.crc >> 8);                //low byte first;

        dataTmp = (uchar)(sendFrame.crc);

        dataTmp = 0x55;



        tmp = 0x55;

       USART_Transmit(&tmp, 1);

        for(i = 1; i <(6+sendFrame.dataLen); i++) {

                if(dataTmp == 0x55) {

                        tmp = 0x56;

                        USART_Transmit(&tmp, 1);

                        tmp = 0x56;

                        USART_Transmit(&tmp, 1);

                }

                else if(dataTmp == 0x56) {

                        tmp = 0x56;

                        USART_Transmit(&tmp, 1);

                        tmp = 0x57;

                        USART_Transmit(&tmp, 1);

                }

                else

                        USART_Transmit(dataTmp + i, 1);

        }

        tmp = 0x55;

        USART_Transmit(&tmp, 1);

        free(dataTmp);

}









/****************/

/*主函数--MAIN*/

/****************/

void main(void)

{

init_devices(); //初始化MAGE16;





Commu_Protocol.frameLen = 2;

Commu_Protocol.function = 0x20;

Commu_Protocol.dataLen = 3;

Commu_Protocol.Data="123";

Commu_Protocol.crc = 0;



USART_Frame_Transmit(Commu_Protocol);

machao 发表于 2007-8-10 17:21:41

若仅仅是20 03 不对,问题在你的程序中。
页: [1]
查看完整版本: 老师好,问下关于串口数据发送问题,为何程序里数据发送不正确?