esp32C2串口不够用(esp_log_set_vprintf)使用任意IO模拟串口解决

c 复制代码
#define GPIO_OUTPUT_IO_0    10
#define GPIO_OUTPUT_PIN_SEL ((1ULL << GPIO_OUTPUT_IO_0))

// 模拟串口0初始化
void iouart0_init(void)
{
    gpio_config_t io_conf = {};
    // disable interrupt
    io_conf.intr_type = GPIO_INTR_DISABLE;
    // set as output mode
    io_conf.mode = GPIO_MODE_OUTPUT;
    // bit mask of the pins that you want to set,e.g.GPIO18/19
    io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;
    // disable pull-down mode
    io_conf.pull_down_en = 0;
    // disable pull-up mode
    io_conf.pull_up_en = 0;
    // configure GPIO with the given settings
    gpio_config(&io_conf);
}

void iouart1_TXD(uint8_t option)
{
    if (1 == option) {
        gpio_set_level(GPIO_OUTPUT_IO_0, 1);
    } else {
        gpio_set_level(GPIO_OUTPUT_IO_0, 0);
    }
}

/*****************************************
 *	函 数 名: iouart1_SendByte
 *	功能说明: 模拟串口发送一字节数据
 *	形    参:无
 *	返 回 值: 无
 ******************************************/
void iouart1_SendByte(uint8_t datatoSend)
{
    uint8_t i, tmp;

    // 开始位
    iouart1_TXD(0); // 将TXD的引脚的电平置低
    esp_rom_delay_us(IO_USART_SENDDELAY_TIME);

    for (i = 0; i < 8; i++) {
        tmp = (datatoSend >> i) & 0x01;

        if (tmp == 0) {
            iouart1_TXD(0);
            esp_rom_delay_us(IO_USART_SENDDELAY_TIME); // 0
        } else {
            iouart1_TXD(1);
            esp_rom_delay_us(IO_USART_SENDDELAY_TIME); // 1
        }
    }

    // 结束位
    iouart1_TXD(1); // 将TXD的引脚的电平置高
    esp_rom_delay_us(IO_USART_SENDDELAY_TIME);
}

void USART_Send(uint8_t *buf, uint8_t len)
{
    uint8_t t;
    for (t = 0; t < len; t++) {
        iouart1_SendByte(buf[t]);
    }
}

uint8_t esp_gpio_log_vprintf(const char *fmt, va_list vp)
{
    static char log_buffer[512];

    taskENTER_CRITICAL();
    size_t len = vsnprintf(log_buffer, sizeof(log_buffer), fmt, vp);
    if (len > sizeof(log_buffer) - 1) {
        log_buffer[sizeof(log_buffer) - 1] = 0;
    }
    USART_Send((uint8_t *)log_buffer, len);
    taskEXIT_CRITICAL(); // 退出基本临界区
    return len;
}

然后重点来了

结果打印 9600 如下

相关推荐
灯厂码农11 小时前
C语言动态内存分配完全指南(malloc、calloc、realloc、free)
java·c语言·算法
wuyk55511 小时前
24. C 语言模块化:不是拆几个.c 文件那么简单
c语言·开发语言·stm32·单片机
qq_2415856111 小时前
可用在中断中浮点数打印类似printf
c语言
C语言小火车13 小时前
C++ 快速排序(Quick Sort)深度精讲:分治思想、Lomuto 分区法及三数取中优化,面试手撕必会
c语言·开发语言·c++·面试·排序算法·快速排序
aaaameliaaa15 小时前
进制练习题【找出只出现一次的数字、交换两个变量(不创建临时变量)、统计二进制中1的个数、打印整数二进制的奇数位和偶数位、求两个数二进制中不同位的个数】
c语言·数据结构·笔记·算法
灯厂码农15 小时前
C语言内存管理——内存对齐与共用体union
linux·服务器·c语言
伏 念17 小时前
AI Coding 零基础实战教程
c语言·进程·预处理
你家人养牛17 小时前
OOC Relation Plugin:C 语言面向对象 开发的高效辅助工具
c语言·vscode
东华万里17 小时前
第30篇 代码习惯 初学C与数据结构有感
c语言·数据结构·大学生专区
想你依然心痛17 小时前
嵌入式C代码规范:MISRA-C 2012核心规则解读——类型安全与未定义行为深度剖析
c语言·安全·代码规范