KEA128 芯片使用 UART2 中断接收不定长 16 进制数据并发送
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; // 清零数据计数
}
}
}
代码解释:
- 首先定义了一个全局数组
receivedData用于存储接收到的数据,同时定义了一个全局变量dataCount用于记录接收到的数据数量。 - 在
UART2_IRQHandler中断处理函数中,我们检查接收数据寄存器满标志位,如果有数据到达,则将其读取并存储在receivedData数组中,并增加dataCount计数。 - 在
initUART2函数中,我们初始化 UART2 的配置,设置波特率为 9600,禁用发送和接收,设置 8 位无奇偶校验,并使能接收中断。 - 在
sendData函数中,我们遍历receivedData数组并将数据发送出去。 - 在
main函数中,我们初始化 UART2 并在一个无限循环中检查dataCount是否大于 0,如果是,则调用sendData函数发送数据,并将dataCount清零。
运行说明:
为了使程序正常运行,还需要在 Keil 环境中添加与 KEA128 芯片相关的头文件和链接器脚本文件,并在项目设置中配置正确的编译和调试选项。
注意事项:
- 代码中的
SKEAZ1284.h需要根据具体的 KEA128 芯片型号进行调整。 - 代码中的
receivedData数组大小可以根据实际需要进行调整。 - 程序需要连接 UART2 串口并配置相应的串口通信参数。
- 为了保证数据完整性,可以考虑添加校验机制。
- 可以根据实际需求对代码进行优化和改进。
原文地址: https://www.cveoy.top/t/topic/nMaj 著作权归作者所有。请勿转载和采集!