当前位置: 首页 > news >正文

中国工程建设造价信息网站网页设计界面图

中国工程建设造价信息网站,网页设计界面图,网站优化需求,管家婆免费资料网站系列文章目录 rt-thread 之 fal移植 rt-thread 之 生成工程模板 文章目录系列文章目录前言一、串口的配置step1:通过串口名字找到串口句柄step2:配置串口参数step3:设置串口接收回调函数step4:打开串口设备前言 UART&#xff08…

系列文章目录

rt-thread 之 fal移植
rt-thread 之 生成工程模板

文章目录

  • 系列文章目录
  • 前言
  • 一、串口的配置
    • step1:通过串口名字找到串口句柄
    • step2:配置串口参数
    • step3:设置串口接收回调函数
    • step4:打开串口设备


前言

UART(Universal Asynchronous Receiver/Transmitter)通用异步收发传输器,UART 作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输,是在应用程序开发过程中使用频率最高的数据总线。我们经常在串口上接WIFI、4G模块,也可以增加电平转换芯片变成RS232和RS485通信接口。rt-thread官网对串口做了详细的说明。这篇文章的目的是讲一下我对串口发送接收模式的理解和使用过程中遇到的问题。

一、串口的配置

找到串口设备
配置串口参数
设置接收回调函数
打开设备

rt-thread串口配置步骤:

step1:通过串口名字找到串口句柄

rt_device_find()
例:
static rt_device_t serial;
#define SAMPLE_UART_NAME       "uart2"
serial = rt_device_find(SAMPLE_UART_NAME);

step2:配置串口参数

串口配置就是我们常见的串口参数配置

	uart2_config.baud_rate = BAUD_RATE_115200;        //修改波特率为 9600uart2_config.data_bits = DATA_BITS_8;           //数据位 8uart2_config.stop_bits = STOP_BITS_1;           //停止位 1uart2_config.bufsz     = 128;                   //修改缓冲区 buff size 为 128uart2_config.parity    = PARITY_NONE;           //无奇偶校验位

这里有个接收缓存区的概念,其实就是一个环形队列,可以缓存串口接收的数据。当接收数据大于缓存区会日志输出告警信息。所以接收到的消息需要及时处理。

        LOG_W("Warning: There is no enough buffer for saving data,"" please increase the RT_SERIAL_RB_BUFSZ option.");

使用rt_device_control()函数修改串口配置参数

struct serial_configure uart2_config = RT_SERIAL_CONFIG_DEFAULT;  /* 初始化配置参数 *//* step2:修改串口配置参数 */uart2_config.baud_rate = BAUD_RATE_115200;        //修改波特率为 9600uart2_config.data_bits = DATA_BITS_8;           //数据位 8uart2_config.stop_bits = STOP_BITS_1;           //停止位 1uart2_config.bufsz     = 128;                   //修改缓冲区 buff size 为 128uart2_config.parity    = PARITY_NONE;           //无奇偶校验位rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &uart2_config);

step3:设置串口接收回调函数

当发生中断(接收中断或者空闲中断)时,会调用注册的回调函数。用户可以在回调函数中写一些无阻塞的功能。虽然回调函数但是在中断中执行,所以不能有阻塞和延时。此回调函数在中断接收和DMA接收时实现的功能不一致。以下代码是中断接收时的参考。

/* 接收数据回调函数 */
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{/* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */rt_sem_release(&rx_sem);cnt++;return RT_EOK;
}/* 设置接收回调函数 */rt_device_set_rx_indicate(serial, uart_input);

step4:打开串口设备

打开设备时可以对串口的模式进行配置,rt-thread提供三种模式:中断模式、轮询模式、DMA 模式。发送和接收只能从中选一个,发送和接收可以配置的不一致。默认使用中断接收和轮训发送。
注:其中UART版本1中STM32中断发送模式有问题,推荐使用V2版本。

/* 以中断接收及轮询发送模式打开串口设备 */
rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflag)

oflag支持模式参数为下列几个:

#define RT_DEVICE_FLAG_INT_RX           0x100           /**< INT mode on Rx 中断接收 */
#define RT_DEVICE_FLAG_DMA_RX           0x200           /**< DMA mode on Rx DMA接收 */
#define RT_DEVICE_FLAG_INT_TX           0x400           /**< INT mode on Tx 中断发送 */
#define RT_DEVICE_FLAG_DMA_TX           0x800           /**< DMA mode on Tx DMA接收 */

rt_device_open函数中初始化DMA模式会进行参数检查,需要确认使用串口DMA宏被定义。如:BSP_UART2_RX_USING_DMA,否则会rt_serial_open()返回错误

/* check device flag with the open flag */
if ((oflag & RT_DEVICE_FLAG_DMA_RX) && !(dev->flag & RT_DEVICE_FLAG_DMA_RX))return -RT_EIO;
if ((oflag & RT_DEVICE_FLAG_DMA_TX) && !(dev->flag & RT_DEVICE_FLAG_DMA_TX))return -RT_EIO;
if ((oflag & RT_DEVICE_FLAG_INT_RX) && !(dev->flag & RT_DEVICE_FLAG_INT_RX))return -RT_EIO;
if ((oflag & RT_DEVICE_FLAG_INT_TX) && !(dev->flag & RT_DEVICE_FLAG_INT_TX))return -RT_EIO;

当对应串口DMA宏在rtconfig.h中被定义后,通过宏定义设置到对应串口对象的uart_dma_flag参数中,在串口初始化阶段通过rt_hw_usart_init()中的rt_hw_serial_register()函数会把对应uart_dma_flag设置到串口dev->flag中,后续串口open时只是检查一下参数。

/* register UART device */
result = rt_hw_serial_register(&uart_obj[i].serial, uart_obj[i].config->name,RT_DEVICE_FLAG_RDWR| RT_DEVICE_FLAG_INT_RX| RT_DEVICE_FLAG_INT_TX| uart_obj[i].uart_dma_flag, NULL);

完整的串口配置例程代码如下所示,其实现的功能是串口收到数据后回传。


/** 程序清单:这是一个 串口 设备使用例程* 例程导出了 uart_sample 命令到控制终端* 命令调用格式:uart_sample uart2* 命令解释:命令第二个参数是要使用的串口设备名称,为空则使用默认的串口设备* 程序功能:通过串口输出字符串"hello RT-Thread!",然后错位输出输入的字符
*/#include <rtthread.h>
#include "module_uart.h"
#include "drv_usart.h"
#define SAMPLE_UART_NAME       "uart2"
struct serial_configure uart2_config = RT_SERIAL_CONFIG_DEFAULT;  /* 初始化配置参数 */
/* 用于接收消息的信号量 */
static struct rt_semaphore rx_sem;
static rt_device_t serial;
uint16_t cnt = 0;
/* 接收数据回调函数 */
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{/* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */rt_sem_release(&rx_sem);cnt++;return RT_EOK;
}static void serial_thread_entry(void *parameter)
{char ch;while (1){/* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */while (rt_device_read(serial, -1, &ch, 1) != 1){/* 阻塞等待接收信号量,等到信号量后再次读取数据 */rt_sem_take(&rx_sem, RT_WAITING_FOREVER);}/* 读取到的数据通过串口错位输出 */
//        ch = ch + 1;rt_device_write(serial, 0, &ch, 1);}
}int uart2_init(void)
{rt_err_t ret;/* 查找系统中的串口设备 */serial = rt_device_find(SAMPLE_UART_NAME);if (!serial){rt_kprintf("find %s failed!\n", SAMPLE_UART_NAME);return RT_ERROR;}/* step2:修改串口配置参数 */uart2_config.baud_rate = BAUD_RATE_115200;        //修改波特率为 9600uart2_config.data_bits = DATA_BITS_8;           //数据位 8uart2_config.stop_bits = STOP_BITS_1;           //停止位 1uart2_config.bufsz     = 128;                   //修改缓冲区 buff size 为 128uart2_config.parity    = PARITY_NONE;           //无奇偶校验位rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &uart2_config);/* 初始化信号量 */rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);/* 以中断接收及轮询发送模式打开串口设备 */rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);/* 设置接收回调函数 */rt_device_set_rx_indicate(serial, uart_input);/* 创建 serial 线程 */rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);/* 创建成功则启动线程 */if (thread != RT_NULL){rt_thread_startup(thread);}else{ret = RT_ERROR;}return ret;
}
///* 导出到 msh 命令列表中 */
//MSH_CMD_EXPORT(uart_sample, uart device sample);
http://www.yayakq.cn/news/110821/

相关文章:

  • php网站开发占比php前台网站开发
  • 如何备案成企业网站青岛航拍公司
  • 餐饮网站建设方案快递服务平台
  • 暗网做网站什么是网络营销?网络营销的特点有哪些?
  • 网站死链接扫描建网站设计
  • 私人订制网站推荐免费wordpress主题
  • 做静态网站dAdd-ons wordpress
  • 网站空间被攻击手机必备软件
  • 长沙 直播网站建设关键词优化下拉管家
  • 管理咨询营销的客户关系如何维护广州网站营销优化qq
  • 云南集优科技网站网盘搜索引擎入口
  • 查看企业信息的网站北京seo优化化
  • 陕西高速公路建设集团公司网站做网站要搭建什么平台
  • 深圳网站建设推广论坛基金公司网站建设
  • jsp的网站哪个浏览器不屏蔽网站
  • 直播网站的建设做票据业务的p2p网站
  • .xyz做网站怎么样photoshop网页版
  • 北京市住房城乡建设厅网站代理网址怎么用
  • cms建站系统 下载wordpress太多重定向
  • 旅游网站域名应该如何设计建设小辣猫的网站
  • 学院评估 网站建设整改wordpress 部署
  • 虹口区网站开发软件开发和网站建设
  • 泰兴做网站的公司建设旅游景点的网站的好处
  • 迪庆企业网站建设公司h5免费制作网站有哪些
  • 环保油 东莞网站建设智能建造技术就业前景
  • 网站美工做图seo方案
  • 不写代码门户网站建设wordpress采集网址
  • 牛博网站建设微网站开发平台有哪些
  • 制作自己盈利的网站php网站开发技术环境要求
  • html下载网站模板网站怎样做淘宝客