STM32
直播中

久醉不醒

9年用户 1037经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

STM8S003K3 UART1中断接收数据,0x00数据容易丢失怎么解决?

如题:串口初始化如下
UART1_CR2=0x00;//禁止收发中断UART1_CR1=0x00;//8位数据位,无奇偶校验UART1_CR3=0x04;//1位停止位// 16MHz 时钟下 19200波特率 写入值 8 000 000/19200==0340UART1_BRR2=0x01;UART1_BRR1=0x34;

回帖(2)

王兰英

2024-3-15 14:44:16
官方的库中有相应的例程,可以对照参考一下:

STM8S_StdPeriph_LibProjectSTM8S_StdPeriph_ExamplesUART1UART1_Interrupt
举报

刘秀英

2024-3-15 16:27:15
在UART1的中断服务程序中添加对接收缓冲区的判断,判断接收到的数据是否为0x00,如果是则进行处理。可以采取以下两种方式来解决0x00数据丢失的问题:

1. 在接收中断服务程序中添加对0x00的判断,并将接收到的数据存储在缓冲区中。在程序的其他地方,可以通过轮询缓冲区的方式读取数据,判断其中是否有0x00数据,然后进行处理。

示例代码:

```c
uint8_t receiveBuffer[MAX_BUFFER_SIZE];
uint16_t receiveIndex = 0;

void UART1_ReceiveInterruptHandler(void)
{
    if (UART1_SR & UART1_SR_RXNE)
    {
        uint8_t data = UART1_DR;

        // 判断接收到的数据是否为0x00
        if (data == 0x00)
        {
            // 进行处理
        }

        // 存储接收到的数据
        receiveBuffer[receiveIndex] = data;
        receiveIndex++;
    }
}
```

2. 使用DMA(直接内存访问)来处理串口数据的接收。DMA可以直接将串口接收到的数据存储到指定的内存区域中,避免数据丢失。

示例代码:

```c
uint8_t receiveBuffer[MAX_BUFFER_SIZE];

void UART1_DMA_Init(void)
{
    // 配置DMA通道
    DMA_CCR1 = 0x00;  // 禁用DMA通道1
    DMA_CNDTR1 = MAX_BUFFER_SIZE;  // 设置数据传输长度
    DMA_CPAR1H = (uint8_t)(UART1_DR >> 8);  // 设置外设地址高位
    DMA_CPAR1L = (uint8_t)(UART1_DR & 0xFF);  // 设置外设地址低位
    DMA_CM0ARH = (uint8_t)(receiveBuffer >> 8);  // 设置存储器地址高位
    DMA_CM0ARL = (uint8_t)(receiveBuffer & 0xFF);  // 设置存储器地址低位
    DMA_CCR1 = (1 << 7) | (1 << 6) | (1 << 4) | (1 << 1);  // 启用DMA通道1,设置为存储器到外设,开启接收中断
}

void UART1_DMA_ReceiveInterruptHandler(void)
{
    // 判断接收到的数据是否为0x00
    if (receiveBuffer[receiveIndex] == 0x00)
    {
        // 进行处理
    }

    receiveIndex++;
}

```
举报

更多回帖

发帖
×
20
完善资料,
赚取积分