打印
[AVR单片机]

atmega16的串口程序串口调试助手收到的数据是0x00

[复制链接]
4105|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kohillyang|  楼主 | 2014-7-7 19:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/**
*本文件头仅用于ATmega16,其他单片机需要进行适当修改
*/
#include <iom16v.h>
#include <macros.h>
//中断函数定义,接收中断
#pragma interrupt_handler UART_RX_Interrupt:12
#pragma interrupt_handler UART_TX_Interrupt:14
#define FOSC 11059200
#define BAUD 9600
/*
定义数据缓存大小
*/
#define UART_BUFFER_SIZE 64
#define UART_BUFFER_MASK (UART_BUFFER_SIZE-1)
/*计算寄存器数值
*异步正常模式
*UBRR UBRRH 与UBRRL 的数值 (0-4095)
*/
#define B_UBRR  (FOSC/(16*BAUD)-1)
/**
*定义缓存数组
**/
static volatile unsigned char UART_BUFFER[UART_BUFFER_SIZE];
static volatile unsigned char RX_NUM=0;
static volatile unsigned char TX_NUM=0;
//设置寄存器,打开中断
void UART_INIT(void){
    UCSRB = 0x00;
        UCSRA = 0x00;
   /*设置数据位为8,1位停止位
        */
        UCSRC = (1<<UCSZ1)|(1<<UCSZ0);
    DDRD|=(1<<PD1);//端口初始化,不知道有没有必要
        UBRRH = B_UBRR/256;
        UBRRL = B_UBRR%256;
   /*
        *接收使能,发送使能,接收中断使能
        *全局中断使能
        */
        UCSRB |= (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
        /*
        打开全局中断
        */
        SREG = 0x80;
}
void delay(unsigned int time){
    while (time--);
}

//发送数据
void sendData(){
        TX_NUM = 0 ;
        SREG = 0; //禁止中断
        /*
        以上禁止中断的方法是否可行?*/
        while (TX_NUM < UART_BUFFER_SIZE){
                while (!(UCSRA&(1<<UDRE)));
                UDR = UART_BUFFER [TX_NUM];
                TX_NUM++;
        }
        TX_NUM = 0 ;
        if (TX_NUM > UART_BUFFER_SIZE){
         TX_NUM = 0;
        }
        SREG = 0x80;  //打开全局中断
       

}
//接收中断函数
void UART_RX_Interrupt(void){
        if (RX_NUM < UART_BUFFER_SIZE){
        UART_BUFFER[RX_NUM] = UDR;
        RX_NUM++;
        sendData();
        }
        if (RX_NUM = UART_BUFFER_SIZE){
        RX_NUM = 0 ;
        }
        if (RX_NUM > UART_BUFFER_SIZE){
        /*
        *程序运行出错
        */
        RX_NUM = 0;
        }       
}
void UART_TX_Interrupt(void){


}

主程序很简单
#include "kohill_UART_INIT.h"
void main(){
UART_INIT();
while (1){
        while (!(UCSRA&(1<<UDRE)));
        UDR = 5;
}
}

程序功能说明:
利用中断方式将收到的数据保存在大小为64的数组中,待数组存满之后将数据发出
波特率:9600bps,晶振:11.0592MHZ
为了测试串口配置的正确性,主程序不间断地发送数字5,用串口调试助手检查收到的数据,但是串口调试助手收到的数据为一堆0x00
觉得应该是波特率没有设置对,但是又不知道哪儿不对







相关帖子

沙发
kohillyang|  楼主 | 2014-7-7 22:02 | 只看该作者
纠结之后i发现不是程序的问题,是晶振的问题啊

使用特权

评论回复
板凳
airwill| | 2014-7-8 07:57 | 只看该作者
0x35, 用串口调试助手检查收到的数据,但是串口调试助手收到的数据为一堆0x00

通常是实际波特率太低才这样.

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
kohillyang + 1 很给力!
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

11

帖子

0

粉丝