找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3401|回复: 2
打印 上一主题 下一主题
收起左侧

mage128串口加超级终端打印程序。。

[复制链接]
跳转到指定楼层
楼主
ID:83710 发表于 2015-6-24 21:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <inttypes.h>
  4. #include <avr/sfr_defs.h>
  5. #include <util/delay.h>
  6. #include <avr/pgmspace.h>
  7. #include <stdio.h>
  8. #include<stdarg.h>
  9. //使用的是mage128的板子,这个是抄别人的,觉得很好用,里面的可变参数的
  10. //理解起来还是有点儿困难的,不过myprintf()这个函数很好用,如果电脑没有
  11. //串口,也可以用usb转串口来实现,需要安装usb转串口驱动,硬件管理器里面可
  12. //以看到安装后的usb-serial的com口,还有设置好波特率
  13. //初始化串口
  14. void init_uart(void)
  15. {
  16. //UART 初始化
  17. UCSR1B=_BV(RXEN1)|_BV(TXEN1);/*(1<<RXCIE0)|(1<<TXCIE0)|*/
  18. UBRR1L=103; //9600 baud 6MHz:38 4MHz:25 16MHZ:103
  19. }
  20. static int uart_putchar(char c)
  21. {
  22. if (c == '\n')
  23. uart_putchar('\r');
  24. loop_until_bit_is_set(UCSR1A, UDRE1);
  25. UDR1 = c;
  26. //mage128中有两个串口可以使用,这里使用了usart1,来发送数据,如果只有一个串口只要把寄存器中的1去掉就可以了,
  27. //这个函数可以将数据发送给串口调试软件,也可以通过xp自带的超级终端来查看所以不一定非要下载串口调试软件,
  28. //当然串口调试软件用起来功能多
  29. return 0;
  30. }
  31. static int uart_getchar()
  32. {
  33. loop_until_bit_is_set(UCSR1A,RXC1);
  34. return UDR1;
  35. //mage128中有两个串口可以使用,这里使用了usart1,来发送数据,如果只有一个串口只要把寄存器中的1去掉就可以了,
  36. //这个函数可以将数据发送给串口调试软件,也可以通过xp自带的超级终端
  37. }
  38. static void myprintf(const char* fmt,...)
  39. {
  40.     const char* s;
  41.     int16_t d;
  42.     char buf[16];
  43.     va_list ap;
  44.     va_start(ap,fmt);   // 将ap指向fmt(即可变参数的第一个?下一个?)
  45.     while (*fmt)
  46.     {
  47.         if (*fmt != '%')//如果不是%,则正常发送,这里不用for来发送所有非%字符的,原因是因为if语句里面有continue语句,//可以跳出循环执行下一个while循环,将所有的非%字符发送完毕,很牛逼,值得学习
  48.         {
  49.             uart_putchar(*fmt++);   // 正常发送
  50.             continue;      //发送完毕以后跳出继续下一个循环,这样就可以继续发送下一个字符
  51.         }
  52.   //由于上面的if以及continue的组合导致非%字符时程序不可能运行到这里,所以一旦运行到这里就说明*fmt++得到的是一个
  53.   //%字符
  54.         switch (*++fmt) //此时fmt先加一再取该地址处的数据原因在于上面是再得到了一个%以后才运行到此的,
  55.   //所以此时不需要理会%了,只要读出%后的字符就可以
  56.         {
  57.          case 's':
  58.              s = va_arg(ap,const char*); // 将ap指针指向的数据类型转换成char*型,并返回之,此时返回一个字符串的首地址
  59.              for (; *s; s++)
  60.                  uart_putchar(*s);
  61.              break;
  62.          case 'x':
  63.              d = va_arg(ap,int);      // 将ap指针指向的数据类型转换成int型,并返回之
  64.              itoa(d,buf,16);          // 将整型d以16进制转到buf中
  65.              for (s = buf; *s; s++)
  66.                  uart_putchar(*s);
  67.              break;
  68.    case 'd':
  69.              d = va_arg(ap,int);
  70.              itoa(d,buf,10);          // 将整型d以10进制转到buf中
  71.              for (s = buf; *s; s++)
  72.                  uart_putchar(*s);
  73.              break;
  74.          default:
  75.               uart_putchar(*fmt);  //%号后面出现的非格式制定字符则按常理发送打印
  76.              break;
  77.         }
  78.         fmt++;        //判断%号后面的字符以后,跳出switch语句,继续while循环,发送打印后面的字符
  79. }
  80.     va_end(ap);
  81. }
  82. int main(void)
  83. {
  84.     init_uart();// 初始化串口
  85.     uint8_t i = 100;
  86.     char * s = "Word!";
  87.     myprintf("\n\rHello %s\n\r0x%x = %d\n",s,i,i);
  88.     return 0;
  89. }
复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:91580 发表于 2016-3-5 19:46 | 只看该作者
感谢分享,我有需要。
回复

使用道具 举报

板凳
ID:135047 发表于 2016-7-26 14:54 | 只看该作者
谢谢楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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