完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
My rx_fifobuffer 只显示 1 个字节,但另一端发送更多字节。我是否正确使用了 API?
#include "uart.h"#define UART_RX_FIFO_SIZE 512#define UART_RX_BLOCK_SIZE 1static uint8_t rx_fifo[UART_RX_FIFO_SIZE];static volatile uint16_t head = 0;static volatile uint16_t tail = 0;static void (*user_rx_callback)(void) = NULL;static inline bool uart_buffer_full(void){ uint16_t next_head = (head + UART_RX_BLOCK_SIZE) % UART_RX_FIFO_SIZE; return (next_head == tail);}static inline bool uart_buffer_empty(void){ return head == tail;}bool uart_read_byte(uint8_t *byte){ if (uart_buffer_empty()) { return false; } *byte = rx_fifo[tail]; tail = (tail + 1) % UART_RX_FIFO_SIZE; return true;}bool uart_init(void){ status_t status = UART_Init( uart_pal1_instance, uart_pal1_Config0); if (status == STATUS_SUCCESS) { status = UART_ReceiveData( uart_pal1_instance, rx_fifo[head], UART_RX_BLOCK_SIZE); if (status == STATUS_SUCCESS) { return true; } } return false;}bool uart_send_data(const uint8_t *data, uint32_t length){ if (data == NULL || length == 0) { return false; } status_t status = UART_SendData( uart_pal1_instance, data, length); return (status == STATUS_SUCCESS);}bool uart_receive_data(uint8_t *data, uint32_t length){ if (data == NULL || length == 0) { return false; } uint32_t i; for (i = 0; i < length; i++) { if (!uart_read_byte( data[i])) { break; } } return (i > 0);}void uart_register_rx_callback(void (*callback)(void)){ user_rx_callback = callback;}void uart0_rx_callback(void *driverState, uart_event_t event, void *userData){ (void)driverState; (void)userData; switch(event) { case UART_EVENT_RX_FULL: { uint16_t next_head = (head + UART_RX_BLOCK_SIZE) % UART_RX_FIFO_SIZE; UART_SetRxBuffer( uart_pal1_instance, rx_fifo[next_head], UART_RX_BLOCK_SIZE); head = next_head; if (head == tail) { tail = (tail + UART_RX_BLOCK_SIZE) % UART_RX_FIFO_SIZE; } if (user_rx_callback != NULL) { user_rx_callback(); } } break; case UART_EVENT_END_TRANSFER: break; case UART_EVENT_ERROR: head = tail = 0; UART_SetRxBuffer( uart_pal1_instance, rx_fifo[head], UART_RX_BLOCK_SIZE); break; default: break; }} |
|
相关推荐
1个回答
|
|
|
针对S32K144的UART接收溢出问题,以下是分步解决方案: 问题原因分析
解决方案1. 修正缓冲区定义将 2. 配置UART硬件FIFO启用UART硬件FIFO并设置合理的触发级别(如1/4 FIFO大小): 3. 优化中断服务程序(ISR)在中断中读取所有可用数据,避免积压: 4. 确保原子操作在修改 5. 主循环及时处理数据在回调函数或主循环中快速取出数据: 6. 检查API使用
关键点总结
通过以上步骤,可有效解决UART接收溢出问题并提升数据接收稳定性。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
2135个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
37383 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
6786 浏览 1 评论
7804 浏览 1 评论
7652 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
5077 浏览 0 评论
1567浏览 2评论
关于NINA-W132 Wi-Fi模块SPI通信遇到的疑问求解
1214浏览 2评论
如何在MPC PowerPC MCU上首次刷写后禁用BDM?
753浏览 1评论
将HFREFR和LFREFR寄存器值设置为错误的值来将故障注入CMU,但CMU_ISR值始终为零,为什么?
740浏览 1评论
将SPSDK for FRDM-MCX-W71 SDK与VS一起安装时出现hidapi构建错误怎么解决?
688浏览 1评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-4 10:38 , Processed in 0.825054 second(s), Total 79, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
747