微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 为什么串口调试助手收到的数据为 0x00?

为什么串口调试助手收到的数据为 0x00?

时间:10-02 整理:3721RD 点击:
是不是串口初始化不对

  1. /**
  2. 本文件头仅用于ATmega16,其他单片机需要进行适当修改
  3. */
  4. #include <iom16v.h>
  5. #include <macros.h>
  6. //中断函数定义,接收中断
  7. #pragma interrupt_handler UART_RX_Interrupt:12
  8. #define FOSC 11059200
  9. #define BAUD 9600
  10. /*
  11. 定义数据缓存大小
  12. */
  13. #define UART_BUFFER_SIZE 64
  14. #define UART_BUFFER_MASK (UART_BUFFER_SIZE-1)
  15. /*计算寄存器数值
  16. *异步正常模式
  17. *UBRR UBRRH 与UBRRL 的数值 (0-4095)
  18. */
  19. #define B_UBRR  (FOSC/(16*BAUD)-1)
  20. /**
  21. *定义缓存数组
  22. **/
  23. static volatile unsigned char UART_BUFFER[UART_BUFFER_SIZE];
  24. static volatile unsigned char RX_NUM=0;
  25. static volatile unsigned char TX_NUM=0;
  26. //设置寄存器,打开中断
  27. void UART_INIT(void){
  28.         UBRRH = B_UBRR/256;
  29.         UBRRL = B_UBRR%256;
  30.    /*
  31.         *接收使能,发送使能,接收中断使能
  32.         *全局中断使能
  33.         */
  34.         UCSRB |= (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
  35.         /*
  36.         打开全局中断
  37.         */
  38.         SREG = 1;
  39.    /*设置数据位为8,1位停止位
  40.         */
  41.         UCSRC = (1<<UCSZ1)|(1<<UCSZ0);
  42.          
  43. }
  44. //发送数据
  45. void sendData(){
  46.         TX_NUM = 0 ;
  47.         SREG = 0; //禁止中断
  48.         /*
  49.         以上禁止中断的方法是否可行?*/
  50.         while (TX_NUM < UART_BUFFER_SIZE){
  51.                 while (!(UCSRA&(1<<UDRE)));
  52.                 UDR = UART_BUFFER [TX_NUM];
  53.                 TX_NUM++;
  54.         }
  55.         TX_NUM = 0 ;
  56.         if (TX_NUM > UART_BUFFER_SIZE){
  57.          TX_NUM = 0;
  58.         }
  59.         SREG = 1;  //打开全局中断
  60.        

  61. }
  62. //接收中断函数
  63. void UART_RX_Interrupt(void){
  64.         if (RX_NUM < UART_BUFFER_SIZE){
  65.         UART_BUFFER[RX_NUM] = UDR;
  66.         RX_NUM++;
  67.         sendData();
  68.         }
  69.         if (RX_NUM = UART_BUFFER_SIZE){
  70.         RX_NUM = 0 ;
  71.         }
  72.         if (RX_NUM > UART_BUFFER_SIZE){
  73.         /*
  74.         *程序运行出错
  75.         */
  76.         RX_NUM = 0;
  77.         }
  78.        
  79. }

复制代码


上一篇:YJD 12864显示屏
下一篇:有关51串口通信

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top