KEA128 芯片使用 UART2 中断接收不定长 16 进制数据并发送

以下是一个使用 KEA128 芯片和 Keil 环境下的 C 语言程序,用于接收不定长度的 16 位进制数值类型数据,并将其存储并一次性从串口发送出去,没有停止位:

#include <stdio.h>
#include <stdint.h>
#include "SKEAZ1284.h"

volatile uint16_t receivedData[100];  // 存储接收到的数据
volatile uint8_t dataCount = 0;  // 接收到的数据数量

void UART2_IRQHandler(void) {
    if (UART2->S1 & UART_S1_RDRF_MASK) {  // 接收数据寄存器满标志位
        receivedData[dataCount] = UART2->D;  // 读取接收数据
        dataCount++;
    }
}

void initUART2() {
    SIM->SCGC |= SIM_SCGC_UART2_MASK;  // 使能 UART2 时钟

    UART2->C2 &= ~(UART_C2_TE_MASK | UART_C2_RE_MASK);  // 禁用 UART2 发送和接收

    UART2->BDH = 0;  // 设置波特率 9600
    UART2->BDL = 156;

    UART2->C1 = 0;  // 8 位无奇偶校验
    UART2->C3 = 0;  // 无需要发送的奇偶校验位

    UART2->C2 |= UART_C2_RIE_MASK;  // 使能接收中断

    NVIC_EnableIRQ(UART2_IRQn);  // 使能 UART2 中断

    UART2->C2 |= (UART_C2_TE_MASK | UART_C2_RE_MASK);  // 使能 UART2 发送和接收
}

void sendData() {
    for (int i = 0; i < dataCount; i++) {
        while (!(UART2->S1 & UART_S1_TDRE_MASK));  // 等待发送数据寄存器为空
        UART2->D = receivedData[i];  // 发送数据
    }
}

int main() {
    initUART2();
    
    while (1) {
        if (dataCount > 0) {
            sendData();
            dataCount = 0;  // 清零数据计数
        }
    }
}

代码解释:

  1. 首先定义了一个全局数组 receivedData 用于存储接收到的数据,同时定义了一个全局变量 dataCount 用于记录接收到的数据数量。
  2. UART2_IRQHandler 中断处理函数中,我们检查接收数据寄存器满标志位,如果有数据到达,则将其读取并存储在 receivedData 数组中,并增加 dataCount 计数。
  3. initUART2 函数中,我们初始化 UART2 的配置,设置波特率为 9600,禁用发送和接收,设置 8 位无奇偶校验,并使能接收中断。
  4. sendData 函数中,我们遍历 receivedData 数组并将数据发送出去。
  5. main 函数中,我们初始化 UART2 并在一个无限循环中检查 dataCount 是否大于 0,如果是,则调用 sendData 函数发送数据,并将 dataCount 清零。

运行说明:

为了使程序正常运行,还需要在 Keil 环境中添加与 KEA128 芯片相关的头文件和链接器脚本文件,并在项目设置中配置正确的编译和调试选项。

注意事项:

  • 代码中的 SKEAZ1284.h 需要根据具体的 KEA128 芯片型号进行调整。
  • 代码中的 receivedData 数组大小可以根据实际需要进行调整。
  • 程序需要连接 UART2 串口并配置相应的串口通信参数。
  • 为了保证数据完整性,可以考虑添加校验机制。
  • 可以根据实际需求对代码进行优化和改进。

原文地址: https://www.cveoy.top/t/topic/nMaj 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录