利用USART1串口输入大量字符然后用DMA方式将这些字符信息传输到主存。统计这些字符中字母字符的个数并由UASRT1串口显示统计结果。
以下是基于STM32F4系列MCU的代码实现:
首先需要初始化USART1串口和DMA,可以使用CubeMX生成代码或手动编写。接下来,在主函数中添加以下代码:
uint8_t rx_buffer[1000]; // 接收缓存区
uint16_t rx_index = 0; // 接收缓存区指针
uint32_t dma_counter = 0; // DMA传输计数器
uint32_t letter_counter = 0; // 字母计数器
// USART1 DMA传输完成回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
dma_counter += 1000; // 计数器加1000
for (int i = 0; i < 1000; i++)
{
if ((rx_buffer[i] >= 'a' && rx_buffer[i] <= 'z') || (rx_buffer[i] >= 'A' && rx_buffer[i] <= 'Z')) // 判断是否为字母
{
letter_counter++; // 字母计数器加1
}
}
HAL_UART_Receive_DMA(&huart1, rx_buffer, 1000); // 再次开启DMA传输
}
int main(void)
{
// 初始化代码省略
HAL_UART_Receive_DMA(&huart1, rx_buffer, 1000); // 开启DMA传输
while (1)
{
HAL_Delay(1000); // 每隔1秒显示一次结果
printf("Letter count: %d\n", letter_counter); // 显示结果
}
}
以上代码中,我们定义了一个接收缓存区rx_buffer,大小为1000字节;一个接收缓存区指针rx_index,用于记录当前接收位置;一个DMA传输计数器dma_counter,用于记录已传输的字节数;一个字母计数器letter_counter,用于记录接收到的字母个数。
在USART1 DMA传输完成回调函数HAL_UART_RxCpltCallback中,我们将DMA传输计数器dma_counter加上1000(因为每次传输1000字节),然后遍历接收缓存区rx_buffer,将字母计数器letter_counter加上字母个数。最后再次开启DMA传输。
在主函数中,我们每隔1秒使用串口将字母计数器的值发送出去,以显示统计结果。可以使用printf或HAL_UART_Transmit等函数进行串口输出。
需要注意的是,由于每次开启DMA传输后,回调函数可能会在中途被触发多次(每传输1000字节触发一次),因此需要在回调函数中正确处理已传输的字节数,避免重复计数。
原文地址: https://www.cveoy.top/t/topic/bDSq 著作权归作者所有。请勿转载和采集!