完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我参考网上一个例程写了一个UART的RX中断接收数据任务(rt thread的线程),除此之外我的main()函数里实现了另外一个任务,SPI(slave)通过中断接收数据,然后做算法运算。 目前的情况是:使用rt_thread_create函数创建的任务UART的RX中断接收函数,如果不使用rt_thread_mdelay延时函数的话,UART的RX中断接收函数可以正常接收数据;但是main()里的程序无法运行;如果UART的RX中断接收函数使用rt_thread_mdelay延时函数的话,UART的RX中断接收函数不可以正常接收数据(丢失数据)。 我觉得应该是我哪里没有使用正确导致的,但是又想不出具体如何解决。特来求助论坛里的大牛们。具体代码如下所示: static rt_err_t uart_recv_callback(rt_device_t dev, rt_size_t size) { rk_ok_flag = 1; return RT_EOK; } 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); } / 线程 / 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; } // 主函数main int main(void) { // 开启UART的RX接收中断线程 thread_serial(); while (1) { do_someting(); rt_thread_mdelay(10); } } 原作者:你的名字 |
|
相关推荐
5个回答
|
|
|
|
|
|
好的,我试一下。谢谢
|
|
|
|
我猜 :常规的写法是在 uart_recv_callback 时发送消息,在thread_entry获取这个消息,以便在没有串口数据时 thread_entry能 挂起
|
|
|
|
用信号量来进行唤醒
|
|
|
|
谢谢。使用信号量已经解决。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
788 浏览 0 评论
4271 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2529 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
2929 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
31479 浏览 11 评论
72917 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 13:27 , Processed in 0.688780 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号