历史上的今天
返回首页

历史上的今天

今天是:2024年11月13日(星期三)

正在发生

2019年11月13日 | mage128串口加超级终端打印程序

2019-11-13 来源:51hei

#include

#include

#include

#include

#include

#include

#include

#include

//使用的是mage128的板子,这个是抄别人的,觉得很好用,里面的可变参数的

//理解起来还是有点儿困难的,不过myprintf()这个函数很好用,如果电脑没有

//串口,也可以用usb转串口来实现,需要安装usb转串口驱动,硬件管理器里面可

//以看到安装后的usb-serial的com口,还有设置好波特率

//初始化串口

void init_uart(void)

{

//UART 初始化

UCSR1B=_BV(RXEN1)|_BV(TXEN1);/*(1<UBRR1L=103; //9600 baud 6MHz:38 4MHz:25 16MHZ:103

}

static int uart_putchar(char c)

{

if (c == 'n')

uart_putchar('r');

loop_until_bit_is_set(UCSR1A, UDRE1);

UDR1 = c;

//mage128中有两个串口可以使用,这里使用了usart1,来发送数据,如果只有一个串口只要把寄存器中的1去掉就可以了,

//这个函数可以将数据发送给串口调试软件,也可以通过xp自带的超级终端来查看所以不一定非要下载串口调试软件,

//当然串口调试软件用起来功能多

return 0;

}

static int uart_getchar()

{

loop_until_bit_is_set(UCSR1A,RXC1);

return UDR1;

//mage128中有两个串口可以使用,这里使用了usart1,来发送数据,如果只有一个串口只要把寄存器中的1去掉就可以了,

//这个函数可以将数据发送给串口调试软件,也可以通过xp自带的超级终端

}

static void myprintf(const char* fmt,...)

{

    const char* s;

    int16_t d;

    char buf[16];

    va_list ap;

    va_start(ap,fmt);   // 将ap指向fmt(即可变参数的第一个?下一个?)

    while (*fmt)

    {

        if (*fmt != '%')//如果不是%,则正常发送,这里不用for来发送所有非%字符的,原因是因为if语句里面有continue语句,//可以跳出循环执行下一个while循环,将所有的非%字符发送完毕,很牛逼,值得学习

        {

            uart_putchar(*fmt++);   // 正常发送

            continue;      //发送完毕以后跳出继续下一个循环,这样就可以继续发送下一个字符

        }

  //由于上面的if以及continue的组合导致非%字符时程序不可能运行到这里,所以一旦运行到这里就说明*fmt++得到的是一个

  //%字符

        switch (*++fmt) //此时fmt先加一再取该地址处的数据原因在于上面是再得到了一个%以后才运行到此的,

  //所以此时不需要理会%了,只要读出%后的字符就可以

        {

         case 's':

             s = va_arg(ap,const char*); // 将ap指针指向的数据类型转换成char*型,并返回之,此时返回一个字符串的首地址

             for (; *s; s++)

                 uart_putchar(*s);

             break;

         case 'x':

             d = va_arg(ap,int);      // 将ap指针指向的数据类型转换成int型,并返回之

             itoa(d,buf,16);          // 将整型d以16进制转到buf中

             for (s = buf; *s; s++)

                 uart_putchar(*s);

             break;

   case 'd':

             d = va_arg(ap,int);

             itoa(d,buf,10);          // 将整型d以10进制转到buf中

             for (s = buf; *s; s++)

                 uart_putchar(*s);

             break;

         default:

              uart_putchar(*fmt);  //%号后面出现的非格式制定字符则按常理发送打印 

             break;

        }

        fmt++;        //判断%号后面的字符以后,跳出switch语句,继续while循环,发送打印后面的字符

}

    va_end(ap);

}

int main(void)

{

    init_uart();// 初始化串口

    uint8_t i = 100;

    char * s = "Word!";

    myprintf("nrHello %snr0x%x = %dn",s,i,i);

    return 0;

}


推荐阅读

史海拾趣

Fortiming Corporation公司的发展小趣事

背景:2001年9月5日,Fortiming Corporation在内华达州正式成立(来源:企查查)。在成立之初,公司就明确了自己的市场定位——专注于提供高质量的石英晶振、晶体振荡器等频率控制产品。

发展:面对当时竞争激烈的电子行业,Fortiming凭借其对技术的深刻理解和对市场需求的敏锐洞察,迅速在石英晶振领域站稳脚跟。公司不仅注重产品研发,还积极引进先进生产设备,提升产品质量和生产效率。

HI Microwave Technology Limited公司的发展小趣事

随着技术的不断积累和市场需求的日益增长,HI Microwave不断加大研发投入,成功开发出了一系列高性能的微波组件产品,包括隔离器、循环器、开关、滤波器、功率分配器/合成器、定向耦合器、天线、混频器、压控振荡器(VCOs)和射频放大器等。这些产品广泛应用于无线电信和光纤通信行业,满足了客户多样化的需求。同时,公司还积极与国内外知名企业和科研机构合作,共同推动微波通信技术的发展。

APM Hexseal公司的发展小趣事

APM Hexseal的产品很快在军事领域获得了广泛应用。公司的密封靴子通过了严格的军事检查和独立的QPL等效项,证明了其卓越的性能和可靠性。此外,APM Hexseal还协助开发了MIL-B-5423规范(现为MIL-DTL-5423),为军方的新设备保护要求设定了初始标准。这一合作不仅提升了APM Hexseal在军事领域的影响力,也为其在电子行业中的发展打开了新的大门。

捷茂微(GATEMODE)公司的发展小趣事

在军队取得初步成功后,APM Hexseal的产品开始进入工业和商业市场。其硅胶密封套系列可与世界各地使用的绝大多数开关、断路器、编码器、电位计和其他旋转设备配合使用,得到了广泛的认可和应用。无论是航空电子、仪器仪表、通讯还是建筑、船舶、医疗等行业,APM Hexseal的产品都发挥着重要的作用。

CUI Devices公司的发展小趣事

在COVID-19全球大流行期间,CUI Devices展现出了高度的社会责任感。公司决定向那些致力于设计和制造抗击疫情关键医疗设备的OEM、制造商、志愿者和组织提供免费的产品样本。这些样本涵盖了呼吸器、呼吸机、血液分析仪、测试设备、患者监护仪、成像系统和家庭医用器材等多个领域。此外,公司还与全球的制造设施和分销合作伙伴紧密合作,以确保其多样化的产品组合能够随时满足市场需求。

德索五金(dosinconn)公司的发展小趣事

发展历程:2008年,公司从工程部门中分出研发部门,并设立研发实验室。连接器定制研发从此成为公司的核心业务,创新意识也深入到了企业文化之中。

成果与影响:研发部门的成立和技术创新的推动使德索五金电子在连接器制造领域保持了领先地位,也为公司的长远发展提供了源源不断的动力。

问答坊 | AI 解惑

不用电池的双音门铃

随着电话机的普及率越来越高,拥有住宅电话的家庭也越来越多,但大多数住宅电话使用率很低,利用电话入户馈线提供的48V(60V)直流馈电作电子门铃的工作能源是经济实用的。现介绍一款不用电池的双音门铃电路。电路原理如图所示,不难看出,图中电路 ...…

查看全部问答>

偶的FPGA ,NIOS的资料,与大家分享

正打算下个版本的示波器使用FPGA做,所以下了一些资料,觉得这篇还不错,传上来. 入门学习很好的资料…

查看全部问答>

关于TCPMP解码图片的问题

     请问各位大侠,我在做wince下用TCPMP解码图片,但是我想将图片绘制在我提供的DC上面该怎么做?      我开发的平台是三星2530,在此之前我做过三星2440下面相同的程序,能将图片解码到我提供的DC上面 ...…

查看全部问答>

请问在ce5.0的platform builder中用cec editor如何添加一个dll文件?

请问在ce5.0的platform builder中用cec editor如何添加一个dll文件?…

查看全部问答>

牛人关于IC设计流程说明:

牛人关于IC设计流程说明:1:Datasheet定义,这个是市场、AE、RD共同完成;2:电路设计,RD完成;3:Layout, Layout Engineer完成,但RD指导并配合(算RD部门);4:IC测试电路,RD定义测试电路和方法,AE完成PCB Layout(此AE一般是跟踪本项目的 ...…

查看全部问答>

教材求助

我是DSP刚入门的菜鸟,跪求关于学习DSP的宝典级教材或是资料!万分感谢!!!!…

查看全部问答>

基于MSP430F149+nRF905无线数传模块的调试心得

调试nRF905无线模块近一个星期之久,下面细说一下基于MSP430F149+nRF905的调试步骤。   l  看到很多网友提出 First:测试nRF905模块是否正常工作        对于发射机  进入发射状态31脚1.5V&nbs ...…

查看全部问答>

飞思卡尔FTF2012中国站:开发创新积极务实的盛会

    8月14日和8月15日 , 飞思卡尔FTF2012中国站在北京国贸大饭店隆重举行。阿牛哥一直关注着FTF盛会,无论是前一段时间FTF2012美国站的报道,还有阿牛哥应邀加过FTF2010上海,FTF2011深圳的盛会。这是一个所有工程师朋友都期待的盛 ...…

查看全部问答>

LM3S9D90 DMA方式ADC高速转换疑点

小生最近在用LM3S9D90,ADC用高速转换(500K的转换速度算快吗?),因此使用DMA进行数据搬移。有两点我是一直搞不懂的: 1、  DMA仲裁机制是干嘛用的? 2、  ADC的缓冲是否一定要32位的? 以下是节选ADC和DMA初始化程序: ...…

查看全部问答>

卖全新未拆封的LM3S811开发套件,C2000LauchPad 以及430LauchPad

要毕业了,才发现有没拆封的开发板:LM3S811卖100,c2000LAUCHpad卖50,430那个卖15.需要的联系马化腾:694311468…

查看全部问答>