Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
UART
RT-Thread 串口透传问题
发布于 2017-09-26 14:47:28 浏览:5645
订阅该版
我在用uart2读取数据然后发送到uart3 的时候遇到一个问题: uart2 读取数据函数 rt_device_read()返回值是0; 用rt_get_errno();函数读取当前线程错误码返回值也是0, 证明rt_device_read()函数是成功执行了,也就是没有读取到数据,可是上面的消息队列已经成功过了阻塞状态, 也就是说是有接收中断产生了。好矛盾。 ```#include "r_uart2_w_uart3.h" #include
#include
static rt_mq_t rx_mq_uart2; static char msg_pool_uart2[512]; static rx_struct rx2_data; static struct rt_messagequeue s_your_mq; rt_err_t uart2_input(rt_device_t dev, rt_size_t size) { static rx_msg_t msg; rt_err_t result; msg.dev = dev; msg.size = size; result = rt_mq_send(rx_mq_uart2, &msg, sizeof(rx_msg_t)); if(result == -RT_EFULL){ rt_kprintf("msg queue2 is full! "); return RT_EFULL; } return RT_EOK; } /** * uart3_thread_entry. * * @param * * * @return * @note */ void uart2_thread_entry(void* parameter) { rt_device_t device_uart2, device_uart3; static rx_msg_t rx_msg; rt_err_t result = RT_EOK; rt_err_t myerrno; device_uart2 = rt_device_find("uart2"); if(device_uart2 != RT_NULL) { rt_kprintf("thread1 open uart2 ok "); rt_device_set_rx_indicate(device_uart2, uart2_input); rt_device_open(device_uart2, RT_DEVICE_OFLAG_RDWR|RT_DEVICE_FLAG_DMA_RX); } rt_mq_init(&s_your_mq,"mq_uart2",&msg_pool_uart2[0],sizeof(rx_msg_t),sizeof(msg_pool_uart2),RT_IPC_FLAG_FIFO); rx_mq_uart2 = &s_your_mq; device_uart3 = rt_device_find("uart3"); if(device_uart3 != RT_NULL) { rt_device_open(device_uart3, RT_DEVICE_OFLAG_RDWR); rt_kprintf("thread1 open uart3 ok "); } while(1) { result = rt_mq_recv(rx_mq_uart2, &rx_msg, sizeof(rx_msg_t), RT_WAITING_FOREVER);/*????2??????????·??ò×è????*/ if(result == RT_EOK) rt_kprintf("mq_recv ok! "); if (result == RT_EOK) { rt_uint32_t rx_length; /*??????2????????*/ rx_length = rt_device_read(rx_msg.dev, 0, rx2_data.rx_buff, RX_BUFF_SIZE); rx2_data.rx_buff[rx_length] = ' '; if(rx_length == 0) { myerrno = rt_get_errno(); rt_kprintf("--------errno: %d ", myerrno); } rt_kprintf("UART2 recive len: %d ", rx_length); /*????????????????????3*/ if(device_uart3 != RT_NULL) { rt_device_write(device_uart3, 0, rx2_data.rx_buff, rx_length); rt_kprintf("UART2 -> UART3 "); } } rt_thread_delay(50); } }```
查看更多
11
个回答
默认排序
按发布时间排序
bernard
2017-09-26
这家伙很懒,什么也没写!
rt_device_read是一个非阻塞调用。当返回0时,就意味着底层没有数据了。
高祥
2017-09-27
这家伙很懒,什么也没写!
今天发现了新的情况:我开了两个线程。 线程1:读串口2,写串口3. 线程2:读串口3,写串口2。 现在的情况是 线程优先级高的那个rt_device_read就读取不到数据, 比如线程1优先级高于线程2,那么线程1的rt_device_read就读取不到数据, 我把优先级将到比线程2低,就可以读到了; 但此时线程2的读取又不行了。 --------和线程优先级有关
bernard
2017-09-27
这家伙很懒,什么也没写!
你的方式有问题吧。直接任务去device_read? 这种一般是uart设备设置rx_ind。当收到数据时,rx_ind会被回掉,然后通知读任务去读取数据。当device_read返回0(即数据读空)时,则读任务继续挂起等待通知。
高祥
2017-09-28
这家伙很懒,什么也没写!
我是在回调函数中给消息队列发送消息,在任务中接受消息队列消息,等有消息接受到才device_read 的。上面代码中有写的。
bernard
2017-09-28
这家伙很懒,什么也没写!
我感觉你上面的代码回丢数据
高祥
2017-09-29
这家伙很懒,什么也没写!
是的,是有时候收不到对方的应答。像这种双方串口通信的应答机制,应怎么做啊。很多时候串口和对方的通信都需要应答,而且还有超时应答重发机制。
RT-WH
2019-07-22
这家伙很懒,什么也没写!
[i=s] 本帖最后由 RT-WH 于 2019-7-22 16:14 编辑 [/i] 这个问题解决了吗 没下文了? 我遇到了类似的问题 串口2 收到数据后串口1 发送数据结果吗 电脑没有收到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("receive c%\n",ch); // // ch = ch + 1; // //rt_device_write(serial, 0, &ch, 1); rt_sem_take(&rx_sem, RT_WAITING_FOREVER); rt_kprintf("receive c%\n",ch); } }
chudy
2019-07-22
这家伙很懒,什么也没写!
1.首先你应指定,例如:/* 接收回调函数 */rt_device_set_rx_indicate(myuart3, uart_input3);,当收到数据后回调接收处理函数uart_input3()来处理接收到的数据; 2.两个任务读写同一个串口必须要加锁,否则会出问题: 例如,写任务: rt_sem_take(&uart3_lock, RT_WAITING_FOREVER);//加锁 rt_device_write(myuart3, 0, &str, 10);//发送数据 rt_sem_release(&uart3_lock); //释放 读任务: rt_sem_take(&uart3_lock, RT_WAITING_FOREVER);//以加锁的形式访问串口3 /* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */ while (rt_device_read(myuart3, -1, &ch, 1) != 1) { rt_sem_release(&uart3_lock);//释放(必须放在rx_sem_uart3前,否则会死锁) /* 阻塞等待接收信号量,等到信号量后再次读取数据 */ rt_sem_take(&rx_sem_uart3, RT_WAITING_FOREVER);//等待uart_input3()发送接收信号量 } /*回调函数*/ rt_err_t uart_input3(rt_device_t dev, rt_size_t size) { /* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */ rt_sem_release(&rx_sem_uart3); return RT_EOK; }
chudy
2019-07-22
这家伙很懒,什么也没写!
>这个问题解决了吗 没下文了? 我遇到了类似的问题 串口2 收到数据后串口1 发送数据结果吗 电脑没有收到 ... --- 你有读数据吗?没有看到啊 你全屏蔽完了 从串口读取一个字节的数据,没有读取到则等待接收信号量 */ while (rt_device_read(serial, -1, &ch, 1) != 1) { /* 阻塞等待接收信号量,等到信号量后再次读取数据 */ rt_sem_take(&rx_sem, RT_WAITING_FOREVER); } // /* 读取到的数据通过串口错位输出 */ rt_kprintf("receive c%\n",ch);
RT-WH
2019-07-22
这家伙很懒,什么也没写!
>你有读数据吗?没有看到啊 你全屏蔽完了 > > 从串口读取一个字节的数据,没有读取到则等待接收信号量 */ --- rt_kprintf("receive c%\n",ch); 我用的这句测试发送的
撰写答案
登录
注册新账号
关注者
0
被浏览
5.6k
关于作者
高祥
这家伙很懒,什么也没写!
提问
2
回答
10
被采纳
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
RT-Thread Studio V2.2.9 Release Note
2
CherryUSB的bootuf2配置
3
在用clangd开发RTT吗,快来试试如何简单获得清晰干净的工作区
4
GD32F450 片内 flash驱动适配
5
STM32H7R7运行CherryUSB
热门标签
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
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
12
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
7
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部