Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
串口DMA接收
ProfiBus-DP
如果才能提高串口回复速度?
发布于 2022-05-30 17:06:47 浏览:779
订阅该版
[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
这家伙很懒,什么也没写!
![compare.png](https://oss-club.rt-thread.org/uploads/20220531/a3c3ee27bd4ccf7bb3973f50fb5f7113.png.webp)
撰写答案
登录
注册新账号
关注者
0
被浏览
779
关于作者
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
国产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
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
16
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
9
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部