原创 在C30中怎样将printf的输出定义到串口2

2010-10-8 14:00 4357 11 9 分类: MCU/ 嵌入式

在C30中,可以用printf函数,将数据输出到串口。很多PIC24/PIC30/PIC33单片机有两个串口,但是默认情况下,数据是输出到串口1的,怎样将printf输出到串口2呢?

在microchip的网站上有一篇相关的说明,说可以通过重载write函数达到使用串口2的目的。但是这篇文档说的不是很清楚,用起来也不太方便。我研究了一下,其实还有更简单的办法:

在pic的库文件libpic30.zip中,我们可以看到write.c这个文件。write.c中包含了write函数的原型:

#include <p30sim.h>
#include <stdio.h>
#include "simio.h"

extern int __C30_UART;

extern volatile UxMODEBITS U2MODEbits __attribute__((__sfr__,weak));
extern volatile UxSTABITS U2STAbits __attribute__((__sfr__,weak));
extern volatile unsigned int U2TXREG __attribute__((__sfr__,weak));
extern volatile unsigned int U2BRG __attribute__((__sfr__,weak));


static void __inline__ dowrite(PSIMIO psimio) {
 __asm__(".pword 0xDAC000" :: "a" (psimio) :
"memory");
}

int __attribute__((__weak__, __section__(".libc")))
write(int handle, void *buffer, unsigned int len) {
 int i;
 volatile UxMODEBITS *umode = &U1MODEbits;
 volatile UxSTABITS *ustatus = &U1STAbits;
 volatile unsigned int *txreg = &U1TXREG;
 volatile unsigned int *brg = &U1BRG;

 switch (handle)
 {
   case 0:
   case 1:
   case 2:
     if ((__C30_UART != 1) && (&U2BRG)) {
       umode = &U2MODEbits;
       ustatus = &U2STAbits;
       txreg = &U2TXREG;
       brg = &U2BRG;
     }

     if ((umode->UARTEN) == 0)
     {
       *brg = 0;
       umode->UARTEN = 1;
     }
     if ((ustatus->UTXEN) == 0)
     {
       ustatus->UTXEN = 1;
     }
     for (i = len; i; --i)
     {
       while ((ustatus->TRMT) ==0);
       *txreg = *(char*)buffer++;
     }
     break;

   default: {
     SIMIO simio;
     register PSIMIO psimio asm("w0") = &simio;

     simio.method = SIM_WRITE;
     simio.u.write.handle = handle;
     simio.u.write.buffer = buffer;
     simio.u.write.len = len;
     dowrite(psimio);
     len = simio.u.write.len;
     break;
   }
 }
 return(len);
}

注意上面用黄色标明的语句,我们可以看到如果(__C30_UART != 1)并且&U2BRG(存在串口2),那么就可以将输出转到串口2。而__C30_UART是libpic30内部定义的变量,这样毕竟简单了。

首先定义一个变量:

extern int __C30_UART;

通过这个变量就可以灵活的将printf、scanf等标准函数的输入输出定义到需要的串口上。

使用串口1:__C30_UART = 1;

使用串口2:__C30_UART = 2;


PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

shaoziyang 2016-5-4 00:19

用google翻译就行

用户1647161 2016-5-3 09:17

谁能对原网页翻译一下呢。。

shaoziyang 2015-5-13 20:59

是的

用户1837675 2015-5-13 15:34

德国网友写的程序

用户177014 2014-8-12 03:08

好用
相关推荐阅读
shaoziyang 2017-12-15 11:06
《micropython 入门指南》正式出版了
第一本专门介绍MicroPython的中文图书《MicroPython入门指南》由电子工业出版社正式出版了(各大书店和网络书店都有)。MicroPython是近年开源社区中最热门的项目之一,它功能强大...
shaoziyang 2017-11-01 15:30
《MicoPython入门指南》一书即将发行
《MicoPython入门指南》一书即将发行,这是第一本专业介绍MicroPython的中文书籍,请大家多关注和支持。​​...
shaoziyang 2017-07-13 19:50
micro:bit 专用电池扩展板
最近Microbit这么火,就想着要做点什么,于是就有了这个Microbit的专用电池扩展板。它完美配合原版的microbit,可以为microbit增加电池、蜂鸣器功能,功能上超过 MI:power...
shaoziyang 2017-06-13 09:09
用pyboard的dac播放音乐
官方的PyBoard带有DAC功能,使用DAC,我们可以播放简单的音乐。 先准备好两根铜丝,一个有源音箱,一个音频线。 然后从官方网站下载两个文件: http://micropython.org/...
shaoziyang 2017-06-13 09:03
microbit巡线小车 BoBBoT
BoBBoT 是一个使用 BBC micro:bit 控制的巡线小车套件,它很容易组装。 它特别为儿童设计,让孩子可以通过实践学习计算机科学概念。使用 BoBBoT 可以学习: 算法设计 (流程图和...
shaoziyang 2017-06-12 08:29
micropython升级到了 1.9.1
micropython升级到了 1.9.1,主要改进有: v1.9.1 修复了 stm32 的 USB 存储, lwIP 绑定和 VFS 问题 This release provides an imp...
我要评论
1
11
关闭 站长推荐上一条 /3 下一条