KEA128芯片在Keil环境下使用UART2中断方法接收串口不定长度的16位进制数值类型数据并存存下来一次性从口串口再发送出来使用C语言编写可运行的所有程序要求无停止位
以下是一个使用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芯片相关的头文件和链接器脚本文件,并在项目设置中配置正确的编译和调试选项。
原文地址: https://www.cveoy.top/t/topic/i2Vt 著作权归作者所有。请勿转载和采集!