搜索
bottom↓
回复: 1

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

[复制链接]

出0入0汤圆

发表于 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 uint  unsigned 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[12];

}txd;



volatile struct

{

   uchar pt;

   uchar ptx;

   uchar buf[12];

}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[rxd.pt]=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[7];

        uchar i;

        uchar tmp;



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

        dataTmp[0] = 0x55;

        dataTmp[1] = sendFrame.frameLen;

        dataTmp[2] = sendFrame.function;

        dataTmp[3] = sendFrame.dataLen;

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

        dataTmp[5 + sendFrame.dataLen] = (uchar)(sendFrame.crc >> 8);                //low byte first;

        dataTmp[4 + sendFrame.dataLen] = (uchar)(sendFrame.crc);

        dataTmp[6 + sendFrame.dataLen] = 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);

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2007-8-10 17:21:41 | 显示全部楼层
若仅仅是20 03 不对,问题在你的程序中。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 12:10

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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