Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
UART
中断
UART的RX中断接收延时函数导致main函数无法正常运行?
发布于 2022-02-16 15:22:06 浏览:905
订阅该版
我参考网上一个例程写了一个UART的RX中断接收数据任务(rt thread的线程),除此之外我的main()函数里实现了另外一个任务,SPI(slave)通过中断接收数据,然后做算法运算。 参考代码:https://cloud.tencent.com/developer/article/1631215 目前的情况是:使用rt_thread_create函数创建的任务UART的RX中断接收函数,如果不使用rt_thread_mdelay延时函数的话,UART的RX中断接收函数可以正常接收数据;但是main()里的程序无法运行;如果UART的RX中断接收函数使用rt_thread_mdelay延时函数的话,UART的RX中断接收函数不可以正常接收数据(丢失数据)。 我觉得应该是我哪里没有使用正确导致的,但是又想不出具体如何解决。特来求助论坛里的大牛们。具体代码如下所示: ```c static rt_err_t uart_recv_callback(rt_device_t dev, rt_size_t size) { rk_ok_flag = 1; return RT_EOK; } ``` ```c static void thread_entry(void *parameter) { /* step1:查找串口设备 */ serial = rt_device_find(SAMPLE_UART_NAME); /* step2:修改串口配置参数 */ config.baud_rate = BAUD_RATE_115200; //修改波特率为 115200 config.data_bits = DATA_BITS_8; //数据位 8 config.stop_bits = STOP_BITS_1; //停止位 1 config.bufsz = 128; //修改缓冲区 buff size 为 128 config.parity = PARITY_NONE; //无奇偶校验位 /* step3:控制串口设备。通过控制接口传入命令控制字,与控制参数 */ rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config); /* step4:打开串口设备。以中断接收及轮询发送模式打开串口设备 */ rt_device_open(serial, RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM); /* step5: 中断服务函数 UART RX*/ rt_device_set_rx_indicate(serial, uart_recv_callback); while (true) { if ((1 == rk_ok_flag) && (0 == rt_device_read(serial, -1, &ch, 1))) { //关闭UART的RX中断标志位,rk_ok_flag置0 rk_ok_flag = 0; buf[i++] = ch; if (buf[i - 2] == '\r' && buf[i - 1] == '\n') { i = 0; log_d("%s", buf); rt_device_write(serial, 0, str, (sizeof(buf) - 1)); memset(buf, 0, 50); } } // **!!!!!!!!!!!问题的关键在于是否打开这个延时函数!!!!!!!!!!** // 如果打开这个延时函数,那么main()里的while(1)可以正常运行,但是本while(true)循环只能进入if ((1 == rk_ok_flag) && (0 == rt_device_read(serial, -1, &ch, 1))),无 //法进入if (buf[i - 2] == '\r' && buf[i - 1] == '\n'); //如果关闭这个延时函数,则本while(true)循环内的功能可以正常使用,但是main()函数的while(1)不能运行; //rt_thread_mdelay(10); } ``` ```c / 线程 / int thread_serial(void) { 创建线程 ,名称是 thread,入口是 thread_entry*/ tid1 = rt_thread_create("thread", thread_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); /* 如果获得线程控制块,启动这个线程 */ if (tid1 != RT_NULL) { rt_thread_startup(tid1); } return 0; } ``` ```c // 主函数main int main(void) { // 开启UART的RX接收中断线程 thread_serial(); while (1) { do_someting(); rt_thread_mdelay(10); } } ```
查看更多
yipenghaha
2022-02-17
这家伙很懒,什么也没写!
1.第一种解决方案,就是把你串口接收任务线程的优先级调到最低,这样就可以不用延时函数。 2.第二种,采用信号量,但是要注意接收以及解析数据的顺序和时间。
4
个回答
默认排序
按发布时间排序
IGDV_1047
2022-02-16
这家伙很懒,什么也没写!
我猜 :常规的写法是在 uart_recv_callback 时发送消息,在thread_entry获取这个消息,以便在没有串口数据时 thread_entry能 挂起
出出啊
2022-02-16
恃人不如自恃,人之为己者不如己之自为也
https://club.rt-thread.org/ask/article/3362.html 看看这个怎么用
crystal266
2022-02-17
嵌入式
参考官方文档的写法,用信号量来进行唤醒 [https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/uart?id=%e8%ae%bf%e9%97%ae%e4%b8%b2%e5%8f%a3%e8%ae%be%e5%a4%87](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/uart?id=%e8%ae%bf%e9%97%ae%e4%b8%b2%e5%8f%a3%e8%ae%be%e5%a4%87)
撰写答案
登录
注册新账号
关注者
0
被浏览
905
关于作者
你的名字
这家伙很懒,什么也没写!
提问
9
回答
6
被采纳
0
关注TA
发私信
相关问题
1
rt thread 2.0.2 usart 接收缓存问题
2
关于STM32串口通信的问题
3
STM32F1+RTT串口接收终端数据丢失问题
4
UART TX丢数据?
5
RTT打开串口的时候如何自定义波特率呢?
6
STM32F4的USART数据接收问题
7
串口1234使用问题
8
串口接收回调函数
9
LPC18xx UART问题讨论
10
x1000串口配置的失败问题
推荐文章
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组件
最新文章
1
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
2
RT-Thread EtherKit开源以太网硬件正式发布
3
如何在master上的BSP中添加配置yml文件
4
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
5
RT-Thread 发布 EtherKit开源以太网硬件!
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
MicroPython
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
16
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
6
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部