接收到的任何字节触发中断
Triggering Interrupt for any byte received
我正在尝试让一个代码工作,该代码在 DMA 循环模式下为进入 STM32 板(不是发现)的 RX 输入的可变数据大小触发中断。例如:CONNECTED\r\nDATAREQUEST\r\n
到目前为止一切顺利,我能够接收数据和所有数据,同时还能触发 DMA 中断。
然后我将创建一个子 RX 消息处理缓冲区,将每个 \r\n 分解为不同的字符数组指针。
msgProcessingBuffer[0] = "COM_OK"
msgProcessingBuffer[1] = "DATAREQUEST"
msgProcessingBuffer[n] = "BlahBlahBlah"
我的问题实际上来自于中断的触发。我想从任意数量的数据触发中断并处理接收到的任何数据。
如果我使用下面的中断请求:
HAL_UART_Receive_DMA(&huart1,uart1RxMsgBuffer, 30);
输入缓冲区需要 30 个字节来触发中断,但等待的时间太多了,因为我想在字符串中找到 \r\n
后立即处理 RX 数据。所以我等不及缓冲区满了才开始处理它。
如果我使用下面的中断请求:
HAL_UART_Receive_DMA(&huart1,uart1RxMsgBuffer, 1;
它会按照我的意愿触发,但在这种情况下使用 DMA 没有意义,因为它会为每个字节触发中断,并且会创建一个只有 1 个字节(duh)的缓冲区,就像 [=47] =].
所以我的问题是,如何在接收到第一个字节时触发 DMA,但仍 receive/process 在单个中断中可能会收到所有数据?我想我可能在这里遗漏了一些基本概念。
此致,
蓝光
简而言之:HAL/SPL 图书馆不提供此类功能。
一般一些 MCU,例如 STM32F091VCT6 有硬件支持 Modbus 和字节流分析(通过接收一些控制字节中断) - 所以如果你在你的项目中使用这样的 MCU,你可以配置通过循环 DMA 接收中断通过接收 '\r' 或 '\n' 字节。
我再说一遍:HAL 或 SPL 不支持此功能,您可以使用它只能通过寄存器工作(请参阅参考手册)。
同时我开了一张ST的票,他们证实了你刚才说的他们还补充说:
支持者提出的解决方案 - 14/4/2016 16:45:22:
嗨吉尔伯托,
可用的 DMA 中断请求列在参考手册的 Table 50,RM0090,http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf。因此,基本上,DMA 中断只能在其中一个事件结束时触发。
• 传输已完成一半
• 转移完成
• 传输错误
• Fifo 错误(溢出、欠载或 FIFO 级别错误)
• 直接模式错误
无法在接收到接收数据流中的特定字符时触发 DMA 中断。您可能希望在收到每个 30 字节的数据包时触发中断,然后处理数据字符串以检查您的 \r\n 字符是否已到达,以便您可以处理数据块。
此致,
MCU 技术支持
我查看了其他一些论坛,发现有解决此问题的方法。
我在循环模式下使用 DMA
,然后我监视 NDTR
,它会在每次通过 UART 接口接收到一个字节时更新它的值。然后我循环调用一个函数(在 while 1 循环或循环中断处理程序中)分解每个消息部分,总是寻找 /n /r 字符。此函数还保存当前 NDTR
值以供比较,如果它自上次 "while 1" 周期以来发生了变化。如果 NDTR
自上一个周期以来发生了变化,我将等待几毫秒以接收剩余的消息(UART 传输速度太慢),然后将这些接收到的消息保存在字符缓冲区数组中以供 post 处理。
如果创建一个大约 50 字节的循环 DMA 缓冲区 (HAL_UART_Receive_DMA(&huart1,uart1RxMsgBuffer, 50)
),我认为这足以补偿程序周期中的任何波动。
我正在尝试让一个代码工作,该代码在 DMA 循环模式下为进入 STM32 板(不是发现)的 RX 输入的可变数据大小触发中断。例如:CONNECTED\r\nDATAREQUEST\r\n
到目前为止一切顺利,我能够接收数据和所有数据,同时还能触发 DMA 中断。
然后我将创建一个子 RX 消息处理缓冲区,将每个 \r\n 分解为不同的字符数组指针。
msgProcessingBuffer[0] = "COM_OK"
msgProcessingBuffer[1] = "DATAREQUEST"
msgProcessingBuffer[n] = "BlahBlahBlah"
我的问题实际上来自于中断的触发。我想从任意数量的数据触发中断并处理接收到的任何数据。
如果我使用下面的中断请求:
HAL_UART_Receive_DMA(&huart1,uart1RxMsgBuffer, 30);
输入缓冲区需要 30 个字节来触发中断,但等待的时间太多了,因为我想在字符串中找到 \r\n
后立即处理 RX 数据。所以我等不及缓冲区满了才开始处理它。
如果我使用下面的中断请求:
HAL_UART_Receive_DMA(&huart1,uart1RxMsgBuffer, 1;
它会按照我的意愿触发,但在这种情况下使用 DMA 没有意义,因为它会为每个字节触发中断,并且会创建一个只有 1 个字节(duh)的缓冲区,就像 [=47] =].
所以我的问题是,如何在接收到第一个字节时触发 DMA,但仍 receive/process 在单个中断中可能会收到所有数据?我想我可能在这里遗漏了一些基本概念。
此致, 蓝光
简而言之:HAL/SPL 图书馆不提供此类功能。
一般一些 MCU,例如 STM32F091VCT6 有硬件支持 Modbus 和字节流分析(通过接收一些控制字节中断) - 所以如果你在你的项目中使用这样的 MCU,你可以配置通过循环 DMA 接收中断通过接收 '\r' 或 '\n' 字节。
我再说一遍:HAL 或 SPL 不支持此功能,您可以使用它只能通过寄存器工作(请参阅参考手册)。
同时我开了一张ST的票,他们证实了你刚才说的他们还补充说:
支持者提出的解决方案 - 14/4/2016 16:45:22: 嗨吉尔伯托,
可用的 DMA 中断请求列在参考手册的 Table 50,RM0090,http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf。因此,基本上,DMA 中断只能在其中一个事件结束时触发。
• 传输已完成一半 • 转移完成 • 传输错误 • Fifo 错误(溢出、欠载或 FIFO 级别错误) • 直接模式错误
无法在接收到接收数据流中的特定字符时触发 DMA 中断。您可能希望在收到每个 30 字节的数据包时触发中断,然后处理数据字符串以检查您的 \r\n 字符是否已到达,以便您可以处理数据块。
此致, MCU 技术支持
我查看了其他一些论坛,发现有解决此问题的方法。
我在循环模式下使用 DMA
,然后我监视 NDTR
,它会在每次通过 UART 接口接收到一个字节时更新它的值。然后我循环调用一个函数(在 while 1 循环或循环中断处理程序中)分解每个消息部分,总是寻找 /n /r 字符。此函数还保存当前 NDTR
值以供比较,如果它自上次 "while 1" 周期以来发生了变化。如果 NDTR
自上一个周期以来发生了变化,我将等待几毫秒以接收剩余的消息(UART 传输速度太慢),然后将这些接收到的消息保存在字符缓冲区数组中以供 post 处理。
如果创建一个大约 50 字节的循环 DMA 缓冲区 (HAL_UART_Receive_DMA(&huart1,uart1RxMsgBuffer, 50)
),我认为这足以补偿程序周期中的任何波动。