以下是一个示例程序,演示了如何在Keil环境下使用UART2中断方法接收不定长度的16位进制数值类型数据,并存储下来,然后一次性从串口再发送出来。程序使用C语言编写。

#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <stdbool.h>
#include <LPC17xx.h>

// 定义缓冲区大小
#define BUFFER_SIZE 100

// 定义全局变量
volatile uint16_t rxBuffer[BUFFER_SIZE];
volatile uint16_t txBuffer[BUFFER_SIZE];
volatile uint8_t rxIndex = 0;
volatile uint8_t txIndex = 0;
volatile bool dataReceived = false;

// UART2中断处理函数
void UART2_IRQHandler(void) {
  // 判断接收中断标志位
  if (LPC_UART2->IIR & (1 << 0)) {
    // 读取接收数据
    rxBuffer[rxIndex++] = LPC_UART2->RBR;
    
    // 判断是否接收到'\n'
    if (rxBuffer[rxIndex - 1] == '\n') {
      rxIndex = 0;
      dataReceived = true;
    }
  }
  
  // 判断发送中断标志位
  if (LPC_UART2->IIR & (1 << 1)) {
    // 发送数据
    LPC_UART2->THR = txBuffer[txIndex++];
    
    // 判断是否发送完毕
    if (txIndex == rxIndex) {
      txIndex = 0;
      LPC_UART2->IER &= ~(1 << 1); // 禁用发送中断
    }
  }
}

int main(void) {
  // 初始化UART2
  LPC_SC->PCONP |= (1 << 24); // 使能UART2的电源
  LPC_PINCON->PINSEL4 &= ~(0xF << 16); // 将P2.8和P2.9引脚设置为UART2功能
  LPC_PINCON->PINSEL4 |= (0x5 << 16);
  LPC_UART2->LCR = (1 << 7); // 设置DLAB位,使能访问DLL和DLM寄存器
  LPC_UART2->DLL = 39; // 设置波特率为9600
  LPC_UART2->DLM = 0;
  LPC_UART2->LCR = 0x03; // 设置数据位为8位,无奇偶校验位,1位停止位
  LPC_UART2->FCR = (1 << 0) | (1 << 1) | (1 << 2); // 设置FIFO使能和复位接收和发送FIFO
  LPC_UART2->IER = (1 << 0); // 使能接收中断
  
  // 使能全局中断
  __enable_irq();
  
  // 注册中断处理函数
  NVIC_EnableIRQ(UART2_IRQn);
  
  // 等待接收数据
  while (!dataReceived);
  
  // 将接收到的数据复制到发送缓冲区
  memcpy(txBuffer, rxBuffer, rxIndex * sizeof(uint16_t));
  
  // 发送数据
  LPC_UART2->IER |= (1 << 1); // 使能发送中断
  
  // 等待发送完毕
  while (txIndex != 0);
  
  // 关闭UART2
  LPC_SC->PCONP &= ~(1 << 24); // 关闭UART2的电源
  
  while (1);
}

在上述示例程序中,我们首先初始化UART2,设置波特率为9600,数据位为8位,无奇偶校验位,1位停止位。然后使能接收中断,等待接收到数据。接收到数据后,将数据复制到发送缓冲区,并使能发送中断。发送完毕后,关闭UART2。

请注意,上述示例程序是一个简化版的示例,可能需要根据实际应用场景进行修改和优化。

KEA128芯片在Keil环境下使用UART2中断方法接收串口不定长度的16位进制数值类型数据并存存下来一次性从口串口再发送出来使用C语言编写可运行的所有程序要求不带r符号

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

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