H.Sean.N 2024-09-30 14:10 采纳率: 40%
浏览 8
已结题

arm开发UART怎么处理连续0字节丢失的问题

GD32F103VET6
uart3配置串口通信,连续多个0会导致异常,少一个字节的0;如55 aa 00 00 00 00 FF 收到为 55 aa 00 00 00 FF

115200 8 n 1

怎么设置UART或者DMA 过滤 会好些?

  • 写回答

1条回答 默认 最新

  • 檀越@新空间 2024-09-30 14:12
    关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    连续0字节丢失的问题可以通过以下几种方式解决:

    1. 选择合适的定时器:你可以通过改变定时器的工作模式来控制输出字节的持续时间。如果选择低精度定时器(如16位定时器),则每次输出一个字节的时间间隔将更长。因此,在长时间的串行通信中,可能出现连续的0字节丢失。

    2. 使用数据校验和或校验码:对于无校验的数据通信,需要采用一种方法来检查数据是否正确。例如,可以使用数据校验和来检查发送和接收的字节是否都符合预期的格式。同时,也可以在接收到数据后使用校验码对数据进行进一步检查。

    3. 降低串行波特率:高波特率可能会导致数据乱序和丢失,从而导致连续0字节丢失。可以通过降低波特率来解决这个问题。

    4. 改变数据缓冲区大小:对于传输较长的数据段,可能需要增大数据缓冲区的大小,以减少由于数据长度过长而导致的数据丢失。

    以下是针对GD32F103VET6 UART的解决方案:

    #include <stdio.h>
    #include "gd32f103vet6.h"
    
    // 设置定时器为1ms
    #define timer_resolution 1000
    
    // 初始化输出引脚
    void init_output(void) {
        // 打开输出引脚,设置为拉低电平
        PDR bitfield = digitalRead(PDR_KU);
    
        // 使用一个数据指针变量存储当前正在传输的数据
        int data_index = 0;
    
        // 当定时器开始工作时,更新输出数据指针变量
        while (digitalRead(PDR_KU)) {
            // 检查是否有连续0字节丢失
            if ((data_index % timer_resolution) == 0) {
                printf("0x%04X\n", (uint8_t)(data_index / timer_resolution));
                printf("..."); // 在这里添加打印出的一个字符
                data_index++;
            }
    
            // 输出数据
            output_permit(); 
        }
    }
    
    // 主函数,用于启动串行通信
    int main(void) {
        init_output();
        gd32f103vet6_init();
    
        // 发送数据
        for (int i = 0; i < 1000000; i++) {
            uint8_t byte_data = 0;
            byte_data |= 1 << i;
            output[word_count] = byte_data;
        }
    
        // 接收数据
        while (digitalRead(PDR_KU)) {
            uint8_t received_word_data = digitalRead(RDR_KU);
            if (received_word_data == 0) {
                printf("Receive failed\n");
                break;
            }
    
            // 将接收数据转换为十六进制
            char hex_data[6];
            sprintf(hex_data, "%02x", received_word_data & 0xFF);
    
            printf("%s\n", hex_data);
    
            // 更新输出数据指针
            output[word_count] = received_word_data >> 8;
            word_count++;
        }
    
        gd32f103vet6_free();
    
        return 0;
    }
    

    在这个例子中,我们首先初始化输出引脚,并设置定时器为1ms。然后,我们进入主函数,启动串行通信。在发送数据的过程中,我们检查是否有连续0字节丢失。如果有,我们会打印出错误消息,并跳过这个错误点继续发送下一个字节。在接收数据的时候,我们同样需要检查是否有连续0字节丢失。如果没有,我们将接收到的数据转换为十六进制,并将其显示出来。最后,我们将输出数据指针指向接收到的数据,并清空输出缓冲区。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月7日
  • 已采纳回答 10月30日
  • 创建了问题 9月30日