Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread
nuc980
【NUC980】第2章 NUC980 IoT UART实践
发布于 2022-03-14 20:55:50 浏览:1103
订阅该版
[tocm] **开发环境:** IDE:RT-Thread Studio,ENV 开发板:NUC980 IoT 很多朋友在调试的时候,都喜欢使用串口来调试。毕竟简单嘛,NUC980 IoT的串口资源非常丰富,BSP中已经有串口驱动,大家可以直接使用。 ## 2.1 RT-Thread 的UART简介 UART和其他设备一样,应用程序通过统一的设备管理接口来访问串口硬件,相关接口如下所示: |函数 |描述| |:--|:--| |rt_device_find() |查找设备| |rt_device_open() |打开设备| |rt_device_read() |读取数据| |rt_device_write() |写入数据| |rt_device_control() |控制设备| |rt_device_set_rx_indicate() |设置接收回调函数| |rt_device_set_tx_complete() |设置发送完成回调函数| |rt_device_close() |关闭设备| 关于API的详细描述请参看官网手册: [uart_v1](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/uart) UART的主要步骤如下所示: >1.首先查找串口设备获取设备句柄。 2.配置串口参数。 3.初始化回调函数发送使用的信号量,然后以读写及中断接收方式打开串口设备。 4.设置串口设备的接收回调函数,之后发送字符串,并创建读取数据线程。 运行序列图如下图所示: ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/138eb1f7ea4cf23d6cca956daf855e0e0c1365b8.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQnJ1Y2VveGw=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) 上述方式是基于中断实现的,当然也可使用DMA,目前UART驱动还不支持,待以后完善吧。 ## 2.2 UART使用实例 NUC980 IoT有10路串口,引出了三路串口,笔者这里使用UART1演示。 首先看下电路图: ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/f5a6fc013b1c1aa280163a53d0339b815ed70dda.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQnJ1Y2VveGw=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) UART1使用的是PF10和PF9。 只需要简单配置就可使用,当然也可使用串口设备了。这里使用env工具配置。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/18c51ef72fa0fdc3be9a0203cc0d68a3d5aa5c27.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQnJ1Y2VveGw=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) 当然啦,也可以说使用RT-Thread Studio开发。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/162dc99fb032066a8f914299015d3321cb89aefb.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQnJ1Y2VveGw=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) 在applications文件夹下新建task.c文件。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/d5d52569f53858e3bea2a105fdf0b391463da67e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQnJ1Y2VveGw=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) 核心代码如下: **[task.c]** ```c /** ****************************************************************************** * @file task.c * @author BruceOu * @version V1.0 * @date 2022-03-12 * @blog https://blog.bruceou.cn/ * @Official Accounts 嵌入式实验楼 * @brief RTT任务 ****************************************************************************** */ /*Includes**********************************************************************/ #include
#include
#include
#define SAMPLE_UART_NAME "uart1" /* 串口设备名称 */ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 初始化配置参数 */ /* 用于接收消息的信号量 */ static struct rt_semaphore rx_sem; static rt_device_t serial; /** * @brief uart_input //接收数据回调函数 * @param dev * size * @retval RT_EOK */ static rt_err_t uart_input(rt_device_t dev, rt_size_t size) { /* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */ rt_sem_release(&rx_sem); return RT_EOK; } /** * @brief serial_thread_entry * @param parameter * @retval None */ 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); } /* 读取到的数据输出 */ rt_kprintf("%c",ch); } } /** * @brief thread_serial * @param None * @retval ret */ int thread_serial(void) { rt_err_t ret = RT_EOK; char uart_name[RT_NAME_MAX]; char str[] = "hello RT-Thread!\r\n"; rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX); /* 查找系统中的串口设备 */ serial = rt_device_find(uart_name); if (!serial) { rt_kprintf("find %s failed!\n", uart_name); return RT_ERROR; } /* 修改串口配置参数 */ config.baud_rate = BAUD_RATE_115200; //修改波特率为 115200 config.data_bits = DATA_BITS_8; //数据位 8 config.stop_bits = STOP_BITS_1; //停止位 1 config.bufsz = 64; //修改缓冲区 buff size 为 128 config.parity = PARITY_NONE; //无奇偶校验位 /* 控制串口设备。通过控制接口传入命令控制字,与控制参数 */ rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &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); /* 发送字符串 */ rt_device_write(serial, 0, str, (sizeof(str) - 1)); /* 创建 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(thread_serial, uart device sample); ``` 编译代码。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/aed186e13312aadd57521134ed810d30307472b7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQnJ1Y2VveGw=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) 成功编译后下载固件到NUC980 IoT中,调试信息如下: ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/3d71ddf0abf9f17b6f0e393b55df2a0670cffd7e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQnJ1Y2VveGw=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) 然后使用MSH命令‘thread_serial’即可使能串口线程。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/627f486d60db353f4f716e47b59ed302337c8235.png#pic_center) 使能串口线程后,串口1将打印‘hello RT-Thread’,用户也可通过串口1发送数据到开发板,发送信息后,调试终端即可看到串口1发送的数据。 ![在这里插入图片描述](https://oss-club.rt-thread.org/uploads/20220714/6b907510ac24f723a67fcd99bbeee0f1d3ff8805.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQnJ1Y2VveGw=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) ### 欢迎访问我的网站 [BruceOu的哔哩哔哩](https://space.bilibili.com/338944611) [BruceOu的主页](https://www.bruceou.cn/) [BruceOu的博客](https://blog.bruceou.cn/) [BruceOu的CSDN博客](https://blog.csdn.net/bruceoxl) [BruceOu的简书](https://www.jianshu.com/u/d8ad9ddc8647) [BruceOu的知乎](https://www.zhihu.com/people/Bruceoxl)
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
BruceOu
这家伙很懒,什么也没写!
文章
27
回答
0
被采纳
0
关注TA
发私信
相关文章
1
RT-THREAD在STM32H747平台上移植lwip
2
正点原子miniSTM32开发板读写sdcard
3
反馈rtt串口驱动对低功耗串口lpuart1不兼容的问题
4
Keil MDK 移植 RT-Thread Nano
5
RT1061/1052 带 RTT + LWIP和LPSPI,有什么坑要注意吗?
6
RT thread HID 如何收发数据
7
求一份基于RTT系统封装好的STM32F1系列的FLASH操作程序
8
RT-Thread修改项目名称之后不能下载
9
rt-studio编译c++
10
有木有移植rt-thread(nano)到riscv 32位MCU上
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
SFUD
msh
ulog
C++_cpp
MicroPython
本月问答贡献
三世执戟
5
个答案
1
次被采纳
RTT_逍遥
4
个答案
1
次被采纳
KunYi
4
个答案
1
次被采纳
xiaorui
1
个答案
1
次被采纳
JonasWen
1
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
3
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部