Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
求助:刚刚下载的2.1.0版本,使用rt_device_read,为什么每次都只能读到一个字节。在哪里修改?
发布于 2016-08-22 09:15:06 浏览:3773
订阅该版
```rt_size_t rt_UartReadCO2(uint8 *buf) { return rt_device_read(Module_device, 0, buf, 30); }``` uart2和uart3都试了,使用com_data_len = rt_UartReadModule(buf);得到的就是com_data_len=1,用过去的某个版本是能正常使用的,可以读到长度为几十。 请问这是为啥呢?刚下载的rt-thread框架,基本没怎么改动。我应该改哪里?
查看更多
12
个回答
默认排序
按发布时间排序
aozima
2016-08-22
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
可能当前就只有1个字节,继续读即可。 非阻塞的,读到多少就返回多少。
yuzeyuan1
2016-08-22
这家伙很懒,什么也没写!
不可能只有一个字节。传感器一秒钟发过来几十个字节,我是两秒读一次。在过去的框架中是好使的,新下载的2.1.0不好使。是不是我有什么东西没开?我一共就加了下面四个函数: ``` rt_CO2_set_device("uart3"); static rt_device_t CO2_device = RT_NULL; rt_size_t rt_UartReadCO2(uint8 *buf) { return rt_device_read(CO2_device, 0, buf, 30); } rt_device_t rt_CO2_set_device(const char *name) { rt_device_t new, old; /* save old device */ old = CO2_device; /* find new console device */ new = rt_device_find(name); if (new != RT_NULL) { if (CO2_device != RT_NULL) { /* close old console device */ rt_device_close(CO2_device); } /* set new console device */ CO2_device = new; rt_device_open(CO2_device, RT_DEVICE_OFLAG_RDWR); } return old; } ``` 然后LED线程里写: ``` while (1) { uint16 com_data_len; uint8 buf[40]; rt_kprintf("length of buf = %d ",sizeof(buf)); // 读取串口数据 com_data_len = rt_UartReadCO2(buf); rt_thread_delay(200); } ``` 读到的com_data_len就一直是1.
一个潘一个锐
2016-08-22
这家伙很懒,什么也没写!
rt_device_open(device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
yuzeyuan1
2016-08-22
这家伙很懒,什么也没写!
改成rt_device_open(device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX);不行,直接就没任何数据输出了。 我的情况是某传感器1秒钟会自动发送几十个字节的数据,STM32使用串口3去读,然后进行数据处理。 以前版本的代码中我是rt_device_open(CO2_device, RT_DEVICE_OFLAG_RDWR);这么写的,也一直好使。这块应该改吗?
aozima
2016-08-22
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
当收到数据后,执行你注册的接收回调,此时至少收到一个字节。 不会出现收不到数据的情况。
yuzeyuan1
2016-08-22
这家伙很懒,什么也没写!
问题在于,按我这种写法,每次读到的是稳稳的一个字节,而不是至少一个字节。以前用的版本很低,那个就没这些问题。所以我想请教2.1.0版是不是还有其它变量我没注意到。
bernard
2016-08-22
这家伙很懒,什么也没写!
单步跟踪调试
xiaolinmuyu
2016-08-24
这家伙很懒,什么也没写!
我理解的是之前版本的框架是轮询读的,现在是中断读,每中断一次读一个字节,那就一个一个读,(当然这么理解不知道对不对,求指正 [s:186] )写个小例程,具体的看finsh中串口的读写实现 ``` #if 1 struct com_test { struct rt_semaphore rx_sem; rt_device_t device; }; struct com_test* g_test_com; rt_device_t com_set_device(const char *name) { rt_device_t new; /* find new console device */ new = rt_device_find(name); if (new != RT_NULL) { if (g_test_com->device != RT_NULL) { /* close old console device */ rt_device_close(g_test_com->device); } /* set new console device */ g_test_com->device = new; } return g_test_com->device; } static rt_err_t com_rx_ind(rt_device_t dev, rt_size_t size) { RT_ASSERT(g_test_com != RT_NULL); /* release semaphore to let finsh thread rx data */ rt_sem_release(&g_test_com->rx_sem); return RT_EOK; } void com_thread_entry(void *parameter) { char ch; if (g_test_com->device == RT_NULL) { com_set_device("uart2"); RT_ASSERT(g_test_com->device); rt_device_set_rx_indicate(g_test_com->device, com_rx_ind); rt_device_open(g_test_com->device, (RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_STREAM | RT_DEVICE_FLAG_INT_RX)); } while (1) { if (rt_sem_take(&g_test_com->rx_sem, RT_WAITING_FOREVER) != RT_EOK) { continue; } while (rt_device_read(g_test_com->device, 0, &ch, 1) == 1) { rt_kprintf("%02x", ch); } } } void com_init(void) { g_test_com = (struct com_test *)rt_malloc(sizeof(struct com_test)); if (g_test_com == RT_NULL) { rt_kprintf("no memory for com "); return; } memset(g_test_com, 0, sizeof(struct finsh_shell)); rt_sem_init(&(g_test_com->rx_sem), "com", 0, 0); } static rt_uint8_t g_com_stack[ 512 ]; static struct rt_thread g_com_thread; void com_thread_startup(void) { rt_err_t result; com_init(); result = rt_thread_init(&g_com_thread, "com", com_thread_entry, RT_NULL, &g_com_stack[0], sizeof(g_com_stack), 4, 10); if (result == RT_EOK) rt_thread_startup(&g_com_thread); } #endif ```
一个潘一个锐
2016-08-24
这家伙很懒,什么也没写!
理解有偏差,接收在中断中,数据存于缓冲区,读在线程中;老老实实按照 bernard总的建议单步调试,万一你只接收到一个字节数据,读出来就是一个啊。 另:新旧版本串口我使用都没问题。
yuzeyuan1
2016-08-26
这家伙很懒,什么也没写!
//使用下面这句时 ``` rt_size_t rt_UartReadCO2(uint8 *buf) { return rt_device_read(CO2_device, 0, buf, 30); } ``` 2.0.0串口读到长度每次都是30,其中第一个字节是正确的,其它的全是255. 2.1.0串口读到长度每次都是1,这一个字节是正确的。 1.2.5串口读到长度每次都是12,这12个字节就是我想要的。这个版本就好使。 三个版本都是直接下载下来添上了相同的代码,但结果完全不一样。 请问有没有2.1.0版本串口读出来不是1的例程呢?给一个呗。现在找不到这三个版本的差别在哪里。 另外xiaolinmuyu的理解不对吗?
撰写答案
登录
注册新账号
关注者
0
被浏览
3.8k
关于作者
yuzeyuan1
这家伙很懒,什么也没写!
提问
4
回答
6
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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
【NXP-MCXA153】 定时器驱动移植
2
GD32F450 看门狗驱动适配
3
【NXP-MCXA153】看门狗驱动移植
4
RT-Thread Studio V2.2.9 Release Note
5
CherryUSB的bootuf2配置
热门标签
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
15
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
8
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部