美文网首页
RTT笔记-串口2

RTT笔记-串口2

作者: lissettecarlr | 来源:发表于2018-12-11 14:24 被阅读0次

该笔记类别主要是在自己学习时做的一些记录,方便自己很久不用忘掉时进行快速回忆

本文表述串口的使用,工程基于官方GIT代码库中的STM32F10X-HAL。
首先打开scons,进入rtt\bsp\stm32f10x-test目录下
运行

menuconfig

进入配置页面后,选择芯片种类,我这开使用的是STM32F103ZE系列,然后打开串口2(默认1是开启了的)
在编译工程

scons --target=mkd5

rt_kprintf调试打印接口

因为默认打开了串口1,系统的shell已经打印都被分配到了这个口上,直接烧写程序将会发现串口1进行如下打印

 \ | /
- RT -     Thread Operating System
 / | \     3.1.1 build Sep 18 2018
 2006 - 2018 Copyright by rt-thread team

main.c中应该就是一个空的主函数,这里其实应该叫做用户主函数,实际主函数不是它,具体在其他文章再讨论。这里系统封装了rt_kprintf函数,可以当做C中的printf用,例如

int main(void)
{
      rt_kprintf("lissettecarlr\n");
    return 0;
}

下载运行会发现,在串口1输出了这个字符串。

串口使用

不仅仅是串口,只要是按照设备操作接口编写的通讯外设都可以按照如下方式使用

  • 根据设备名称查找该设备
  • 绑定回调函数
  • 打开设备
  • 进行通讯
    那么以串口为例,最简单的使用方式如下
static rt_err_t uart_intput(rt_device_t dev, rt_size_t size)
{    
    return RT_EOK;
}

static rt_device_t uart_device = RT_NULL;
static char* str ="lissettecarlr";
int main(void)
{
      uart_device=rt_device_find("uart2");
      rt_device_set_rx_indicate(uart_device, uart_intput);
      rt_device_open(uart_device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX );  
      rt_device_write(uart_device, 0, str, strlen(str));
    return 0;
}

上列代码没有进行错误判断,主要是对其使用驱动的几个步骤,所以还可以写成:

rt_err_t uart_open(const char *name)
{
    rt_err_t res;
    uart_device = rt_device_find(name);   
    if (uart_device != RT_NULL)
    {   
        res = rt_device_set_rx_indicate(uart_device, uart_intput);
        if (res != RT_EOK)
        {
            rt_kprintf("set %s rx indicate error.%d\n",name,res);
            return ERROR;
        }
        res = rt_device_open(uart_device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX );       
        if (res != RT_EOK)
        {
            rt_kprintf("open %s device error.%d\n",name,res);
            return ERROR;
        }
    }
    else
    {
        rt_kprintf("can't find %s device.\n",name);
        return -RT_ERROR;
    }
    return RT_EOK;
}

接下来针对上列函数简单说明一下

rt_device_set_rx_indicate(rt_device_t dev,rt_err_t (*rx_ind)(rt_device_t dev,rt_size_t size))

该函数主要绑定数据接收的回调函数,第二个参数是一个函数,rt_size_t size表示进入该回调时接收到的数据长度。进入回调后可以使用rt_device_read函数读取接收到的哪一个字节。例如测试可以写成这样

static rt_err_t uart_intput(rt_device_t dev, rt_size_t size)
{   
      int res=0;
      rt_kprintf("size:%d\n",size);
      res=rt_device_read(uart_device, 0, rcvBuff, 1);
      if(res>0)
        rt_kprintf("data:%d\n",rcvBuff[0]);
       else
          rt_kprintf("!!!!!");
    return RT_EOK;
}

通过给串口2发送一个字节,串口1将会打印。该回调函数是在芯片读取到一个字节并且将其保存到了buffer中后才发生的,想要一次接收多个数据的话,只需要等待到多少次回调发生即可,还有就是在串口中进行打印是会打断后面数据接收的,如果仅仅想测试接收多个数据可以写成下列

static rt_err_t uart_intput(rt_device_t dev, rt_size_t size)
{   

      int res=0;
      if(size>=5)
        {
            res=rt_device_read(uart_device, 0, rcvBuff, 5);
            if(res>0)
            {
                for(int i=0;i<5;i++)
                  rt_kprintf("data:%02X ",rcvBuff[i]);
                 rt_kprintf("\n");
            }
            else
                rt_kprintf("!!!!!");
      }
    return RT_EOK;
     
}

串口2发送5个字节,串口1将其打印。因为是笔记所以这些测试函数也就随便写,实际上数据接收回调接收到数据时,应该对外抛事件或者信号量,各种骚操作都不要写到这里面。

关于串口参数的修改

/* 串口设备句柄 */
static rt_device_t uart_device = RT_NULL;

     /* 查找系统中的串口设备 */
    uart_device = rt_device_find("uart1");

    /* 串口配置结构体,使用serial.h的宏定义 */
    struct serial_configure gps_use_config = 
    {
        BAUD_RATE_9600,   /* 9600 bits/s */
        DATA_BITS_8,      /* 8 databits */
        STOP_BITS_1,      /* 1 stopbit */
        PARITY_NONE,      /* No parity  */ 
        BIT_ORDER_LSB,    /* LSB first sent */
        NRZ_NORMAL,       /* Normal mode */
        1024,             /* Buffer size */
        0   
    };
            /* 先打开串口设备,才能修改 */
            if (rt_device_open(device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX ) != RT_EOK)
    {
        rt_kprintf("uart open error.\n");
    }
        /* 修改串口配置参数 */
     if (RT_EOK != rt_device_control(uart_device, RT_DEVICE_CTRL_CONFIG,(void *)&gps_use_config))
    {
        rt_kprintf("uart config baud rate failed.\n");
    }

如果仅仅修改波特率可以如下

struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
config.baud_rate = 115200;
rt_device_control(serial1, RT_DEVICE_CTRL_CONFIG, &config);

相关文章

  • RTT笔记-串口2

    该笔记类别主要是在自己学习时做的一些记录,方便自己很久不用忘掉时进行快速回忆 本文表述串口的使用,工程基于官方GI...

  • RTT笔记-串口1

    该笔记类别主要是在自己学习时做的一些记录,方便自己很久不用忘掉时进行快速回忆 串口 /DeviceDrivers/...

  • RTT笔记-PIN-2

    该笔记类别主要是在自己学习时做的一些记录,方便自己很久不用忘掉时进行快速回忆 应用 1 在工程中加载配置 在 me...

  • 【BLE】NRF52 打印Log的方法

    NRF的SDK集成了串口和RTT打印,通过配置sdk_config.h来切换打印的方式。 Log的初始化:红框的函...

  • Android 串口通信开发笔记3:CMake 方式实现和 多对

    上一篇:Android 串口通信笔记2 调试工具分析 工具类实现分析、项目实现Android串口开发 延伸和扩展,...

  • 工欲善其事,必先利其器:RTT2UART——像串口一样使用Seg

    关于Segger RTT的文章前面也写了一两篇了,主要是现在调试基本上都用它,谁让芯片的串口少呢……………………S...

  • 工欲善其事,必先利其器:通过Telnet访问SEGGER RTT

    Segger提供了RTT Viewer、RTT Client和RTT Logger3个工具用于RTT的访问,下面列...

  • RTT笔记-shell

    RTT笔记-shell 模式切换 finsh同时支持c-c-style模式和msh模式,默认进入msh模式,在该模...

  • RTT笔记-线程

    继续按照程序流程前进,前面提到的时钟初始化,堆初始化都还未跳出板级初始化rt_hw_board_init函数 然后...

  • RTT笔记-SPI

    该笔记类别主要是在自己学习时做的一些记录,方便自己很久不用忘掉时进行快速回忆 1 简述 和串口不同,SPI属于总线...

网友评论

      本文标题:RTT笔记-串口2

      本文链接:https://www.haomeiwen.com/subject/wzoshqtx.html