Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
串口DMA接收
如果才能提高串口回复速度?
发布于 2022-05-30 17:06:47 浏览:405
订阅该版
[tocm] ## 问题描述: 我用DMA中断接收, 在中断回调中发送消息, 串口接收线程中解析数据并回复. 整个过程数据响应没有问题, 从收到到回复大概是6ms. 但ProfibusDP响应要求达到2ms. 请问我有什么办法可以改进响应速度吗? ```c //接收中断回调函数 static rt_err_t uart2_dma_callback(rt_device_t dev, rt_size_t size) { /* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */ struct rx_msg msg; rt_err_t result; msg.dev = dev; msg.size = size; result = rt_mq_send(&profidp_rx_mq, &msg, sizeof(msg)); if ( result == -RT_EFULL) { /* 消息队列满 */ rt_kprintf("message queue full!\n"); } return result; } /******************************************************************************* * @fn serial_thread_entry(void *parameter) * * @brief 串口接收线程 * * @param none * * @return none *******************************************************************************/ static void serial_thread_entry(void *parameter) { struct rx_msg msg; rt_mutex_t profidp_send_mx = RT_NULL; //互斥信号量 rt_err_t result; rt_uint16_t rx_length; //static rt_uint8_t rx_buffer[RT_SERIAL_RB_BUFSZ + 1]; profidp_send_mx = rt_mutex_create ("profidp_send_mx", RT_IPC_FLAG_FIFO); while (1) { rt_kprintf("serial_thread_entry tick is %ld\r\n", rt_tick_get()); rt_pin_write(RS485_RX_TX_EN, PIN_LOW); rt_memset(&msg, 0, sizeof(msg)); profibus_watchdog_proc(); /* 从消息队列中读取消息*/ result = rt_mq_recv(&profidp_rx_mq, &msg, sizeof(msg), RT_WAITING_NO/*RT_WAITING_FOREVER*/); if (result == RT_EOK) { /* 从串口读取数据*/ rx_length = rt_device_read(msg.dev, 0, m_rtUsart2RxBuf, msg.size); if (rx_length >= 6 && rx_length < PROFIDP_RX_BUF_LEN) { //rx_buffer[rx_length] = '\0'; //rt_memcpy(m_rtUsart2RxBuf, rx_buffer, rx_length); rt_kprintf("rx_length is %d tick is %ld\r\n", rx_length, rt_tick_get()); rt_mutex_take(profidp_send_mx, RT_WAITING_FOREVER); rt_pin_write(RS485_RX_TX_EN, PIN_HIGH); hw_profibusdp_rx_proc(m_rtUsart2RxBuf, rx_length);; rt_pin_write(RS485_RX_TX_EN, PIN_LOW); rt_mutex_release(profidp_send_mx); } } } } /******************************************************************************* * @fn profibus_uart_init(void) * * @brief 串口初始化 * * @param none * * @return none *******************************************************************************/ int profibus_uart_init(void) { rt_err_t open_result = RT_EOK; rt_pin_mode(RS485_RX_TX_EN, PIN_MODE_OUTPUT); rt_pin_write(RS485_RX_TX_EN, PIN_LOW); profibusdp_serial=rt_device_find(DP_UART_PORT_NAME); if(RT_NULL == profibusdp_serial) { rt_kprintf("uart2 find failed !\n"); } else { hw_profibusdp_init(); rt_mq_init(&profidp_rx_mq, "profidp_rx_mq" ,msg_pool, sizeof(struct rx_msg), sizeof(msg_pool), RT_IPC_FLAG_FIFO); profibusdp_uart_config.baud_rate = BAUD_RATE_9600; profibusdp_uart_config.data_bits = DATA_BITS_9; profibusdp_uart_config.stop_bits = STOP_BITS_1; profibusdp_uart_config.bufsz = PROFIDP_RX_BUF_LEN; profibusdp_uart_config.parity = PARITY_EVEN; rt_device_control(profibusdp_serial, RT_DEVICE_CTRL_CONFIG, &profibusdp_uart_config); open_result = rt_device_open(profibusdp_serial, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_DMA_RX); /* using interrupt mode when DMA mode not supported */ if (open_result == -RT_EIO) { open_result = rt_device_open(profibusdp_serial, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX); } RT_ASSERT(open_result == RT_EOK); rt_device_set_rx_indicate(profibusdp_serial, uart2_dma_callback); } rt_thread_t thread = rt_thread_create("profidp_serial", serial_thread_entry, RT_NULL, 1024, 0, 10); if (thread != RT_NULL) { rt_thread_startup(thread); } return RT_EOK; } ```
查看更多
lchnu
2022-05-30
Witness, Understand, Skill
rt-kprintf打印要时间的,你试着开启ulog,使用log-d等在idle中异步打印,就不占用你的线程处理时间了。一键配置与开启,挺方便的。 115200bps下,6ms大约输出: 11520*0.006 = 69bytes 看起来和你的6ms时间以及输出字符数量差不多。
3
个回答
默认排序
按发布时间排序
出出啊
2022-05-30
致男人们:劝说是不会有成果的。 —— 《单向街》
serialX 发送不被阻塞的前提下,基本不耗用线程时间,起码不会浪费业务时间。 详细情况请移步我的文章介绍。
yc985055
2022-05-31
这家伙很懒,什么也没写!

撰写答案
登录
注册新账号
关注者
0
被浏览
405
关于作者
yc985055
这家伙很懒,什么也没写!
提问
6
回答
38
被采纳
0
关注TA
发私信
相关问题
1
rt-thread串口DMA接收方式疑问
2
关于rt-thread的串口驱动dma接收的疑问?
3
串口驱动中UART_DMA_RX_IRQHandler函数的疑问
4
volatile在多线程及串口驱动框架中的应用疑问
5
bsp中stm32串口dma接收
6
RT-THREAD STUDIO 配置UART5 DMA中断接收 报错
7
串口DMA接收数据,一条数据多次回调
8
stm32l4r5zi lpuart1无法接收数据
9
stm32h750串口dma可以进中断,但无法接收数据
10
STM32 串口DMA接收问题
推荐文章
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
如何用Ubuntu qemu跑zephyr_polling的蓝牙
2
分享一种很简单的不阻塞TCP发送方法
3
stm32c86使用串口3时无法正常读到中断的数据
4
如何用ART-PI跑zephyr_polling的蓝牙
5
掌上单片机实验室 – 基于 RTT 框架的第一个应用
热门标签
RT-Thread Studio
串口
LWIP
Env
SPI
AT
FinSH
Bootloader
CAN总线
ART-Pi
Hardfault
文件系统
USB
DMA
RT-Thread
线程
SCons
RT-Thread Nano
stm32
MQTT
ESP8266
ota
UART
RTC
freemodbus
rtthread
rt-smart
packages_软件包
I2C
WIZnet_W5500
flash
cubemx
FAL
定时器
BSP
AB32VG1
PWM
ADC
SDIO
msh
socket
LVGL
keil
Debug
C++_cpp
中断
编译报错
SFUD
SMP
MicroPython
本月问答贡献
出出啊
1431
个答案
317
次被采纳
小小李sunny
1342
个答案
267
次被采纳
crystal266
505
个答案
149
次被采纳
whj467467222
1212
个答案
142
次被采纳
张世争
590
个答案
135
次被采纳
本月文章贡献
出出啊
3
篇文章
5
次点赞
小小李sunny
1
篇文章
1
次点赞
crystal266
1
篇文章
3
次点赞
whj467467222
2
篇文章
4
次点赞
张世争
6
篇文章
14
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部