KEA128芯片在Keil环境下使用UART2中断方法接收串口不定长度的16位进制数值类型数据并存存下来一次性从口串口再发送出来使用C语言编写可运行的所有程序要求无停止位要求接收到的数据是8个元素不符要求时数组清除
下面是使用KEA128芯片在Keil环境下,使用UART2中断方法接收串口不定长度的16位进制数值类型数据,并存储下来,然后一次性从串口再发送出来的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SKEAZ1284.h"
#define BUFFER_SIZE 8
volatile uint8_t rxBuffer[BUFFER_SIZE];
volatile uint8_t rxIndex = 0;
volatile uint8_t rxComplete = 0;
void UART2_IRQHandler(void)
{
if (UART2_S1 & UART_S1_RDRF_MASK)
{
uint8_t data = UART2_D;
if (rxIndex < BUFFER_SIZE)
{
rxBuffer[rxIndex++] = data;
}
if (rxIndex == BUFFER_SIZE)
{
rxComplete = 1;
rxIndex = 0;
}
}
}
void UART2_Init(void)
{
// Enable UART2 clock
SIM_SCGC |= SIM_SCGC_UART2_MASK;
// Set UART2 pin muxing
PORTA_PCR1 = PORT_PCR_MUX(2); // UART2_RX
PORTA_PCR2 = PORT_PCR_MUX(2); // UART2_TX
// Disable UART2 before configuring
UART2_C2 &= ~UART_C2_TE_MASK;
UART2_C2 &= ~UART_C2_RE_MASK;
// Configure UART2 for 115200 baud rate
UART2_BDH = 0x00;
UART2_BDL = 0x17;
UART2_C4 = 0x0F;
// Enable UART2 receiver interrupt
UART2_C2 |= UART_C2_RIE_MASK;
// Enable UART2
UART2_C2 |= UART_C2_TE_MASK;
UART2_C2 |= UART_C2_RE_MASK;
// Enable UART2 interrupt in NVIC
NVIC_EnableIRQ(UART2_IRQn);
}
void UART2_SendData(uint8_t* data, uint8_t length)
{
for (uint8_t i = 0; i < length; i++)
{
while (!(UART2_S1 & UART_S1_TDRE_MASK));
UART2_D = data[i];
}
while (!(UART2_S1 & UART_S1_TC_MASK));
}
int main(void)
{
UART2_Init();
while (1)
{
if (rxComplete)
{
// Process received data
// ...
// Send data back
UART2_SendData(rxBuffer, BUFFER_SIZE);
// Clear buffer and flag
memset(rxBuffer, 0, sizeof(rxBuffer));
rxComplete = 0;
}
}
return 0;
}
在上述代码中,我们使用UART2的中断来接收串口数据,并存储到rxBuffer数组中。当接收到8个字节的数据时,设置rxComplete标志位并清除rxIndex计数器。在主循环中,如果rxComplete标志位被设置,表示接收到了完整的数据,我们可以对接收到的数据进行处理,并通过UART2发送回去。最后,我们清除rxBuffer数组并重置rxComplete标志位,以便接收下一组数据。
请注意,代码中的波特率设置为115200,如果需要其他波特率,请根据实际情况修改相关寄存器的值。另外,代码还未实现对接收到的数据的处理部分,你可以根据自己的需求进行相应的处理。
原文地址: https://www.cveoy.top/t/topic/i2WQ 著作权归作者所有。请勿转载和采集!