USART_RX_STA的数据是如何生成的

文章介绍了USART_RX_STA在嵌入式系统中作为自定义变量用于存储串口接收状态,包括数据长度、完整性和错误检测。通过中断服务程序处理接收到的数据,如存储到缓冲区、检查结束符和接收完成标志。主循环中根据USART_RX_STA的内容进行数据处理和状态更新。

USART_RX_STA是一个用户自定义的变量,用于存储串口接收的状态信息,如数据接收是否完成、接收的数据长度、错误状态等。USART_RX_STA通过分配特定的位来表示不同的状态。例如:
低14位用于存储接收到的数据长度。
第15位用于表示是否接收到完整的数据包(如以0x0D 0x0A结尾)。
其他位可能用于表示错误状态或额外的控制信息。

因为不是自带的库函数,所以需要人为自己设定一个接收数据并处理USART_RX_STA的函数。
具体思路为,在当USART接收到一个字符时,将触发USART的RX中断。
在中断服务程序中,首先读取接收到的数据到一个缓冲区中,并更新USART_RX_STA。
如增加接收计数、检查是否接收到结束符等。
如果接收到预期的结束符组合(如0x0D 0x0A),则设置接收完成标志位。

// 假设有一个全局定义的接收缓冲区USART_RX_BUF,以及状态变量USART_RX_STA
volatile uint8_t USART_RX_BUF[USART_RX_BUFFER_SIZE]; // 接收缓冲区大小根据实际需要定义
volatile uint16_t USART_RX_STA = 0; // 接收状态变量,这里假设低14位用于存储接收数据长度,最高位用于表示接收完成

void USART1_IRQHandler(void) {
    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { // 接收中断发生
        uint8_t received_data = USART_ReceiveData(USART1); // 读取接收到的数据

        // 将接收到的数据存入缓冲区,并增加接收计数
        if (USART_RX_STA < USART_RX_BUFFER_SIZE) { // 防止数据溢出
            USART_RX_BUF[USART_RX_STA++] = received_data;
        } else {
            // 如果缓冲区已满,可以在这里处理溢出情况,例如丢弃新数据或触发错误标志
        }

        // 检查是否接收到预期的结束符组合(0x0D 0x0A)
        if (USART_RX_STA >= 2 && 
            USART_RX_BUF[USART_RX_STA - 2] == 0x0D &&
            USART_RX_BUF[USART_RX_STA - 1] == 0x0A) {

            // 设置接收完成标志位
            USART_RX_STA |= 0x8000; // 将最高位置1,表示接收完成
        }
    }
}

// 主循环中处理接收到的数据
void ProcessReceivedData(void) {
    if ((USART_RX_STA & 0x8000) && (USART_RX_STA > 0)) { // 检查接收完成标志位
        uint16_t data_length = USART_RX_STA & 0x3FFF; // 获取实际接收到的数据长度(低14位)

        // 处理接收缓冲区中的数据
        ProcessBuffer(USART_RX_BUF, data_length);

        // 清除接收状态,准备接收下一个数据包
        USART_RX_STA = 0;
    }
}

然后可以利用USART_RX_STA作为串口接收的标志位:
根据其内容进行相应的数据处理操作。
比如检查接收完成标志位,若为1,则读取接收缓冲区中的数据并进行下一步处理。
清除已处理数据的相关标志位,准备接收下一个数据包。

// 定义USART_RX_STA
volatile uint16_t USART_RX_STA;

// 中断服务程序
void USART1_IRQHandler(void) {
    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { // 接收中断
        uint8_t received_data = USART_ReceiveData(USART1); // 读取数据
        if (USART_RX_STA & 0x8000 == 0) { // 如果接收未完成
            // 将数据存入缓冲区,并更新接收计数
            // 示例:USART_RX_BUF[USART_RX_STA++] = received_data;
            if (received_data == 0x0D) { // 检查回车符
                // 检查下一个字符是否为换行符,如果是,则设置接收完成标志
            }
        }
    }
}

// 主循环或处理函数
void process_USART_data(void) {
    if ((USART_RX_STA & 0x8000) && (USART_RX_STA & 0x4000)) { // 检查接收完成标志
        // 从USART_RX_BUF中读取数据,并进行处理
        // 示例:process_buffer(USART_RX_BUF, USART_RX_STA & 0x3FFF);
        // 清除接收状态,准备接收下一个数据包
        USART_RX_STA = 0;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值