Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
UART
请问rt_thread 注册一个串口接收中断函数如何传递一些参数
发布于 2018-08-31 10:07:49 浏览:2212
订阅该版
有两个问题 一、 调用RT thread的设备驱动层注册一个串口接收中断回调函数。然后在里面调用rt_device_read 每次读一个一节?还是读多个字节?然后写入到环形缓冲。如果每次读一个字节就退出中断了会不会频繁进出中断效率低?如果一次读多字节会不会占用中断时间太长?? 还是说每次调用读一个字节然后写个whlie循环。直到读回字节空再退出中断回调? 二、 注册一个串口中断接收函数,但我想实现面向对象,所以需要给这个接收中断函数传递一对像指针该如何实现。 ShellIoUart.h #ifndef __SHELLIO_UART_H__ #define __SHELLIO_UART_H__ #define SHELL_IO_UART_QUEUE_BUF_LENGTH 64 typedef struct _ShellIoUartHal{ ShellIoInterface_t Interface; rt_device_t mUartDevice; ElementQueue_t mReceiveQueueHal; char mReceiveBuf[SHELL_IO_UART_QUEUE_BUF_LENGTH]; bool mEnableState; }ShellIoUartHal_t; #endif ShellIoUart.c ShellIoInterface_t* GetShellIoUart(ShellIoUartHal_t *me, char* mDeviceName) { QueueInitParam_t mInitParam; ShellIoInterface_t *mInterface = (ShellIoInterface_t *)me; memset(me, 0, sizeof(ShellIoUartHal_t)); mInitParam.pBuf = me->mReceiveBuf; mInitParam.MaxElement = SHELL_IO_UART_QUEUE_BUF_LENGTH; mInitParam.ElementSize = sizeof(char); mInitParam.RecoveType = QUEUE_FULL_NO_RECOVE; QueueCreate(&me->mReceiveQueueHal, &mInitParam); mInterface->SendByte = &gShellIOUartendByte; mInterface->SendFlush = &gShellIOUarteSendFlush; mInterface->SendBuf = &gShellIOUarteSendBuf; mInterface->Init = &gShellIOUarteInit; mInterface->EnableSet = &gShellIOUarteEnableSet; mInterface->ReadEnableState = &gShellIOUarteReadEnableState; mInterface->Process = &gShellIOUarteProcess; mInterface->ReadBufLength = &gShellIOUarteReadBufLength; mInterface->ReadByte = &gShellIOUarteReadByte; mInterface->SetBaudRateOrClk = &gShellIOUarteSetBaudRateOrClk; mInterface->ReadProcessProid = &gShellIOUarteReadProcessProid; me->mUartDevice = rt_device_find(mDeviceName); if(me->mUartDevice == NULL) { TRACE_ERROR("can't find %s device.
", mDeviceName); while(1); } else { rt_err_t res; res = rt_device_set_rx_indicate(me->mUartDevice, uart_intput); /* 检查返回值 */ if (res != RT_EOK) { rt_kprintf("set %s rx indicate error.%d
", mDeviceName, res); while(1); } } return mInterface; } 如上所示。我需要给uart_intput 传递对像指针。因为我可能有多个uart的shellio. 回调函数uart_intput需要知道当前要往哪个uartshellio. 的环形缓冲mReceiveQueueHal写入数据。
查看更多
4
个回答
默认排序
按发布时间排序
inkfish321
2018-08-31
这家伙很懒,什么也没写!
看来只能这样改了 struct rt_device { struct rt_object parent; /**< inherit from rt_object */ enum rt_device_class_type type; /**< device type */ rt_uint16_t flag; /**< device flag */ rt_uint16_t open_flag; /**< device open flag */ rt_uint8_t ref_count; /**< reference count */ rt_uint8_t device_id; /**< 0 - 255 */ /* device call back */ rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size); rt_err_t (*tx_complete)(rt_device_t dev, void *buffer); #ifdef RT_USING_DEVICE_OPS const struct rt_device_ops *ops; #else /* common device interface */ rt_err_t (*init) (rt_device_t dev); rt_err_t (*open) (rt_device_t dev, rt_uint16_t oflag); rt_err_t (*close) (rt_device_t dev); rt_size_t (*read) (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size); rt_size_t (*write) (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size); rt_err_t (*control)(rt_device_t dev, int cmd, void *args); #endif #if defined(RT_USING_POSIX) const struct dfs_file_ops *fops; struct rt_wqueue wait_queue; #endif void *user_data; /**< device private data */ void *app_data; //增加一个app_data指针 }; ShellIoInterface_t* GetShellIoUart(ShellIoUartHal_t *me, char* mDeviceName) { QueueInitParam_t mInitParam; ShellIoInterface_t *mInterface = (ShellIoInterface_t *)me; memset(me, 0, sizeof(ShellIoUartHal_t)); mInitParam.pBuf = me->mReceiveBuf; mInitParam.MaxElement = SHELL_IO_UART_QUEUE_BUF_LENGTH; mInitParam.ElementSize = sizeof(char); mInitParam.RecoveType = QUEUE_FULL_NO_RECOVE; QueueCreate(&me->mReceiveQueueHal, &mInitParam); mInterface->SendByte = &gShellIOUartSendByte; mInterface->SendFlush = &gShellIOUarteSendFlush; mInterface->SendBuf = &gShellIOUarteSendBuf; mInterface->Init = &gShellIOUarteInit; mInterface->EnableSet = &gShellIOUarteEnableSet; mInterface->ReadEnableState = &gShellIOUarteReadEnableState; mInterface->Process = &gShellIOUarteProcess; mInterface->ReadBufLength = &gShellIOUarteReadBufLength; mInterface->ReadByte = &gShellIOUarteReadByte; mInterface->SetBaudRateOrClk = &gShellIOUarteSetBaudRateOrClk; mInterface->ReadProcessProid = &gShellIOUarteReadProcessProid; me->mUartDevice = rt_device_find(mDeviceName); if(me->mUartDevice == NULL) { TRACE_ERROR("can't find %s device.\n", mDeviceName); while(1); } else { me->mUartDevice.app_data = me; rt_err_t res; res = rt_device_set_rx_indicate(me->mUartDevice, ShellIoUartIrqHandle); /* 检查返回值 */ if (res != RT_EOK) { rt_kprintf("set %s rx indicate error.%d\n", mDeviceName, res); while(1); } } return mInterface; } void ShellIoUartIrqHandle(rt_device_t dev, rt_size_t size) { ShellIoUartHal_t *pUart = (ShellIoUartHal_t *)dev.app_data; }
须弥指间
2018-09-03
这家伙很懒,什么也没写!
顶一下,别沉了
misonyo
2019-01-21
这家伙很懒,什么也没写!
RTT的串口框架本身就有一个缓冲区,每次读取数据就是从这个缓冲区读取。
小菜鸟爱吃菜
2019-09-20
这家伙很懒,什么也没写!
>RTT的串口框架本身就有一个缓冲区,每次读取数据就是从这个缓冲区读取。 --- 这个框架在哪个文件里啊,我想调大串口中断接收的缓冲区的大小
撰写答案
登录
注册新账号
关注者
0
被浏览
2.2k
关于作者
inkfish321
这家伙很懒,什么也没写!
提问
1
回答
1
被采纳
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
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
五分钟玩转RT-Thread新社区
5
国产MCU移植系列教程汇总,欢迎查看!
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【Vision Board 创客营】Vision Board上的ADC实践
2
FRDM-MCXN947 & RT-Thread的CAN实践——控制GM6020云台电机
3
[Vision Board创客营]WDT实践之配置、issue、PR一条龙
4
恩智浦FRDM-MCXN947上的RW007联网实践
5
[Vision Board创客营]学习片上Flash移植FAL
热门标签
RT-Thread Studio
串口
LWIP
Env
SPI
Bootloader
AT
ART-Pi
CAN总线
Hardfault
FinSH
USB
文件系统
RT-Thread
DMA
SCons
线程
RT-Thread Nano
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
ota在线升级
WIZnet_W5500
I2C_IIC
UART
flash
cubemx
packages_软件包
freemodbus
潘多拉开发板_Pandora
PWM
定时器
ADC
BSP
中断
keil_MDK
编译报错
socket
MicroPython
GD32
msh
Debug
ulog
SDIO总线
SFUD
rt_mq_消息队列_msg_queue
C++_cpp
本月问答贡献
xiaorui
6
个答案
3
次被采纳
sakumisu
4
个答案
3
次被采纳
三世执戟
31
个答案
1
次被采纳
梦笑真美
18
个答案
1
次被采纳
踩姑娘的小蘑菇
14
个答案
1
次被采纳
本月文章贡献
Z_Y
2
篇文章
5
次点赞
Alipay
2
篇文章
2
次点赞
2345vor
2
篇文章
1
次点赞
比特饼干
1
篇文章
6
次点赞
Lu_盼盼
1
篇文章
3
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部