注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
damiaa的个人空间 https://home.eeworld.com.cn/space-uid-59433.html [收藏] [复制] [分享] [RSS]
日志

【FireBeetle 2 ESP32 C6开发板】 4 mqtt uart透传

已有 213 次阅读2024-5-27 21:39 |个人分类:esp32

       【FireBeetle 2 ESP32 C6开发板】 4 mqtt uart透传

 

 

一、本实验用到esp32 的uart、 mqtt、freertos多任务和信号量。


1,首先我们 创建两个任务uart的收和发


 

2,在创建信号量和共享数据区供mqtt和uart之间共享数据


Mqtt送 数据到uart用到了信号量,uart到mqtt就直接在uart任务里面发了。


3,定义发送topic/topic/uarttomqtt
和接收topic /topic/mqtttouartq0 /topic/mqtttouartq1

 

4,处理topic数据:

 

二、部分代码

 

串口相关

int sendData_uart0(const char* logName, const char* data,int len)
{
   // const int len = strlen(data);
    const int txBytes = uart_write_bytes(UART_NUM_0, data, len);
    ESP_LOGI(logName, "Wrote %d bytes", txBytes);
    return txBytes;
}
static void tx_task(void *arg)
{
    static const char *TX_TASK_TAG = "TX_TASK";
    esp_log_level_set(TX_TASK_TAG, ESP_LOG_INFO);
    while (1) {
        if(  MtoUsema.xMSet != NULL ){
            xSemaphoreTake(  MtoUsema.xMSet, portMAX_DELAY ); 
            { 
                if( MtoUsema.flag ==1)
                {
                     MtoUsema.flag =0;
                    sendData_uart0(TX_TASK_TAG,  MtoUsema.buf, MtoUsema.len);
                     MtoUsema.len=0;
                }
            } 
            xSemaphoreGive(  MtoUsema.xMSet ); /* 互斥量必须归还! */ 
        }
        
        vTaskDelay(100 / portTICK_PERIOD_MS);
    }
}

static void rx_task(void *arg)
{
    static const char *RX_TASK_TAG = "RX_TASK";
    esp_log_level_set(RX_TASK_TAG, ESP_LOG_INFO);
    uint8_t* data = (uint8_t*) malloc(RX_BUF_SIZE + 1);
    while (1) {
        const int rxBytes = uart_read_bytes(UART_NUM_0, data, RX_BUF_SIZE, 1000 / portTICK_PERIOD_MS);
        if (rxBytes > 0) {
            data[rxBytes] = 0;
            ESP_LOGI(RX_TASK_TAG, "Read %d bytes: '%s'", rxBytes, data);
            ESP_LOG_BUFFER_HEXDUMP(RX_TASK_TAG, data, rxBytes, ESP_LOG_INFO);

            UtoMsema.len=rxBytes+1; 
            snprintf(UtoMsema.buf,UtoMsema.len,"%s",data);
            UtoMsema.flag =1;
          	esp_mqtt_client_publish(client, "/topic/uarttomqtt", UtoMsema.buf, 0, 0, 0);
		}                      
    }
    free(data);
}

信号量的创建

typedef struct _SEMA
{
    SemaphoreHandle_t xMSet;
    char buf[300];
    char flag;
    int len;
}sema;
sema MtoUsema, UtoMsema;  



....
while(1){
...

    MtoUsema.flag=0;
    MtoUsema.len=0;
    MtoUsema.xMSet=NULL;
    UtoMsema.flag=0;
    UtoMsema.len=0;
    UtoMsema.xMSet=NULL;
    for(int i=0;i<300;i++)
    {
        MtoUsema.buf[i]=0;
        UtoMsema.buf[i]=0;
    } 
    vSemaphoreCreateBinary(  MtoUsema.xMSet );
    if(  MtoUsema.xMSet != NULL )
    {
    }
    if( MtoUsema.xMSet != NULL ){  printf("The semaphore xMSet1 was created successfully! can now be used.\n");}
    vSemaphoreCreateBinary(  UtoMsema.xMSet );
    if(  UtoMsema.xMSet != NULL )
    {
    }
    if( UtoMsema.xMSet != NULL ){  printf("The semaphore xMSet2 was created successfully! can now be used.\n");}
...
}

信号量的使用

...
case MQTT_EVENT_DATA:
        ESP_LOGI(TAG, "MQTT_EVENT_DATA");
        printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
        printf("DATA=%.*s\r\n", event->data_len, event->data);
        
        if( MtoUsema.xMSet != NULL ){
            xSemaphoreTake( MtoUsema.xMSet, portMAX_DELAY ); 
            { 
                MtoUsema.len=event->data_len%300+1;
                snprintf( MtoUsema.buf, MtoUsema.len,"%s",event->data);
                MtoUsema.flag =1;
            } 
            xSemaphoreGive( MtoUsema.xMSet ); /* 互斥量必须归还! */ 
        }
        break;

...
static void tx_task(void *arg)
{
    static const char *TX_TASK_TAG = "TX_TASK";
    esp_log_level_set(TX_TASK_TAG, ESP_LOG_INFO);
    while (1) {
        if(  MtoUsema.xMSet != NULL ){
            xSemaphoreTake(  MtoUsema.xMSet, portMAX_DELAY ); 
            { 
                if( MtoUsema.flag ==1)
                {
                     MtoUsema.flag =0;
                    sendData_uart0(TX_TASK_TAG,  MtoUsema.buf, MtoUsema.len);
                     MtoUsema.len=0;
                }
            } 
            xSemaphoreGive(  MtoUsema.xMSet ); /* 互斥量必须归还! */ 
        }
        vTaskDelay(2000 / portTICK_PERIOD_MS);
    }
}

三、实验结果如下:

 

Mqtt到uart
Uart到mqtt
谢谢。

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章