四轴飞行器1.2.2 RT-Thread 串口
       本来是打算说根据RT-Thread的设备管理提供的驱动接口些串口驱动的,但是仔细一看,我去,串口驱动写好了,只需要调用就可以了。下面我们说说具体怎么使用的。
      首先在rt_hw_board_init()函数里面有个rt_hw_usart_init(),这个就是串口初始化的函数了,而且RTT已经写好了三个串口的初始化,只需要修改下宏定义就可以使用,RTT实在用心良苦啊,这都帮我们写好了。
      个人的一点看法,可能不是很全面,能力有限。其实我对函数rt_hw_usart_init()的名字有点异议,我觉得应该写成rt_hw_mcu_usart_init(),为什么呢?没错,我们一般会把系统框架从底层到上层分为 硬件层、驱动层、系统层和应用层,但是在硬件层中我以前做项目的时候会更加细分一下,这样可以方便以后的移植,怎么说呢,我会把它具体分为IO口部分这是硬件层最底层的,然后再分为MCU设备部分,MCU设备部分就包括MCU自带的硬件模块(串口,IIC,SPI,DCMI,SDIO,DMA,定时器等等)。IO口部分是定义各IO口的连接的设备。这样在系统中就会有一个最底层的文件叫做Pindefs.h,用来定义IO口,然后就是MCU部分的各自带设备的驱动。之后才是驱动层,如果只直接操作IO口的驱动可以直接调用Pindefs.h,如果是通过MCU的设备(串口,IIC,SPI)操作外围器件,驱动可以调用MCU部分的驱动。之所以把MCU设备部分放在硬件层而不是驱动层我是这样考虑的,很简单,驱动层调用MCU设备部分对外围设备进行操作,MCU设备部分比驱动层第一级,所以放在硬件层了,也比较好理解。然后将驱动层和硬件层统一划为BSP层,也就是班级支持包层。这样细分之后的好处就是当更改板子布局,改变IO口功能的时候,只需要改变Pindefs.h就完成了移植,如果更换了MCU,只需要更换MCU设备部分的代码,可以提高系统的灵活性,而且代码重用率也可以很高,用过一个MCU后,以后用这款MCU大部分代码就都可以重用了。
        接下来讲正事,在rt_hw_usart_init() 函数里面,可以看到通过三个宏定义进行预编译,需要用哪个就定义对应的宏定义,RTT就会对对应的串口进行初始化了,宏定义如下:

 #define RT_USING_UART1
#define RT_USING_UART2
#define RT_USING_UART3

宏定义在 Board.h里面,呵呵,我又觉得这个名字是mcu.h对我来说会更习惯些。。

宏定义好了,然后串口怎么输出数据呢?在RTT里面调用设备驱动的接口函数rt_device_write就可以实现串口的打印了,具体我们以控RTT的控制台应用(finsh)为例进行下说明。

在rt_hw_usart_init() 下面有个函数

 #ifdef RT_USING_CONSOLE
rt_console_set_device(CONSOLE_DEVICE);
#endif

这是个控制台初始化函数,关于CONSOLE_DEVICE 有在Board.h 里面有如下定义,意思就是定义控制台通过哪个串口和外界通讯,我们板子是窗口1,所以#define STM32_CONSOLE_USART      1 ,同时RT_USING_CONSOLE 预编译宏定义一定要记得打开。

 #define STM32_CONSOLE_USART      1
#if STM32_CONSOLE_USART == 0
#define CONSOLE_DEVICE "no"
#elif STM32_CONSOLE_USART == 1
#define CONSOLE_DEVICE "uart1"
#elif STM32_CONSOLE_USART == 2
#define CONSOLE_DEVICE "uart2"
#elif STM32_CONSOLE_USART == 3
#define CONSOLE_DEVICE "uart3"
#endif

这个控制台是怎么用的呢?主要是通过rt_kprintf函数调用的,类似于VC中的printf函数,printf通过电脑屏幕显示,rt_kprintf是通过串口打印出来,在电脑装个串口调试助手就可以显示出来了。在rt_kprintf函数中可以看到函数 rt_device_write(_console_device, 0, rt_log_buf, length); 其中_console_device就是在之前rt_console_set_device设定好的串口对应的设备的句柄(暂时称之为句柄),调用rt_device_write数据就通过串口发出去了。

在rtthread_startup函数中调用了rt_show_version(),用来现实RTT版本信息,rt_show_version() 里面调用的是rt_kprintf函数输出的信息。
可以清楚的看到版本信息,这里我们打开了finsh的功能,可以方便调试,里面调用了两个命令,list和list_thread命令,具体可以看 RTT的手册。 

四轴飞行器1.2.2 RT-Thread 串口的更多相关文章

  1. 四轴飞行器1.3 MPU6050(大端)和M4的FPU开启方法

    四轴飞行器1.3 MPU6050(大端)和M4的FPU开启方法  原创文章,欢迎转载,转载请注明出处      最近时间花在最多的地方就是STM32的I2C上了.之前就知道STM32的I2C并不好用, ...

  2. 四轴飞行器1.1 Matlab 姿态显示

    四轴飞行器1.1 Matlab 姿态显示 开始做四轴了,一步一步来,东西实在很多,比较杂.先做matlab上位机,主要用来做数据分析,等板子到了可以写飞控的程序了,从底层一层一层开始写..希望能好好的 ...

  3. 四轴飞行器1.5 各种PID对比分析及选择

    原创文章,欢迎转载,转载请注明出处 这篇文章主要介绍我对PID的理解,以及选择PID算法的过程. 一 PID的理解和学习过程 二 飞控的PID效果 先上个飞控PID的响应的视频:介绍在后面 地址:ht ...

  4. 四轴飞行器1.7 NRF24L01P无线通讯和改进型环形缓冲(转)

    源: 四轴飞行器1.7 NRF24L01P无线通讯和改进型环形缓冲

  5. 从零开始的四轴飞行器-开篇flag

    在这里立下flag,我要理解学会四轴飞行器的控制方法.

  6. 四轴飞行器飞行原理与双闭环PID控制

    四轴轴飞行器是微型飞行器的其中一种,相对于固定翼飞行器,它的方向控制灵活.抗干扰能力强.飞行稳定,能够携带一定的负载和有悬停功能,因此能够很好地进行空中拍摄.监视.侦查等功能,在军事和民用上具备广泛的 ...

  7. RT Thread 通过ENV来配置SFUD,操作SPI Flash

    本实验基于正点原子stm32f4探索者板子 请移步我的RT Thread论坛帖子. https://www.rt-thread.org/qa/forum.php?mod=viewthread& ...

  8. STM32 + RT Thread OS 串口通讯

    1.   创建项目 a)   禁用Finsh和console b)   默认情况下,项目文件包含了finsh,它使用COM1来通讯,另外,console输出(rt_kprintf)也使用了COM1.因 ...

  9. STM32 + RT Thread OS 学习笔记[二]

    串口通讯例程 通过上面的练习,对STM32项目开发有了一个直观印象,接下来尝试对串口RS232进行操作. 1.   目标需求: 开机打开串口1,侦听上位机(使用电脑串口测试软件)发送的信息,然后原样输 ...

随机推荐

  1. 关于EJB 时间注解与oracle数据库时间格式

    EJB中Temporal是时间注解,其中TemporalType是时间注解的枚举类型其中包括 TemporalType类型,请看源码/*** Type used to indicate a speci ...

  2. ssm+easyUI datagrid 不能显示后台controller层返回的json数据

    后台打印查询出来的数据: {"total":29,"rows":[{"department_id":0,"department_n ...

  3. UNITY使用高通Vuforia导出XCode包编译出错

    1.referenced from: in libVuforia.a 此处重新导入引用库并按http://game.ceeger.com/forum/read.php?tid=20447(三楼处理方式 ...

  4. HTML meta refresh 刷新与跳转(重定向)页面

    <meta http-equiv="refresh" content="5; url=http://www.cnblogs.com/" /> 可用于 ...

  5. Docker镜像与仓库(二)Dockerfile

    Docker镜像文件与仓库(二) Docker镜像文件与仓库(二) Dockerfile指令 Dockerfile格式: 1.#Comment注释2.INSTRUCTION大写的指令名 argumen ...

  6. iframe中调用父iframe中的方法

    function getRootWin(){       var win = window;       while (win != win.parent){            win = win ...

  7. JavaScript装逼指南

    如何写JavaScript才能逼格更高呢?怎样才能组织JavaScript才能让别人一眼看出你不简单呢?是否很期待别人在看完你的代码之后感叹一句“原来还可以这样写”呢?下面列出一些在JavaScrip ...

  8. Nodejs学习笔记——Assert(断言)

    Assert - a:actual e:expected m:message o:operator v:value b:block assert.fail(a, e, m, o) assert(v, ...

  9. Silverlight并行下载与串行下载

    思路清晰后仅仅只需百来行代码便可轻松编写出一套完整的资源动态下载组件- SerialDownloader和ParallelDownloader,它们共用一个完成资源表,且串行下载集成了优先机制(Dow ...

  10. DLR、ASTER GDEM、SRTM3、GMTED2010等5种全球高程数据对比

      目前网上有多种全球高程数据,国内在这方面也进步喜人,资源三号目前已放出来的卫片给了不少惊喜,其高程数值得期待.但资源三号的高程数据放出来还需等待,过去两三年全球高程数据发展相当迅猛,DLR放出了相 ...