Picproje Elektronik Sitesi

ENDÜSTRiYEL OTOMASYON => IoT => Konuyu başlatan: mr.engineer - 28 Ekim 2022, 22:03:07

Başlık: esp32 uart
Gönderen: mr.engineer - 28 Ekim 2022, 22:03:07
Merhaba,
ESP32'de uart kullanırken diğer cihazdan data gelirken bazen şöyle bir hata çıkıyor:

İlk paket karşıdaki cihazdan geldiğinde uart'dan şu şekilde okuyorum

1- 54 00 88 77 99

İkinci paket geldiğinde okurken şu şekilde okuyorum:

2- 54 00 88 77 99 11 02 65 34 10 00 00 01

Gerçekte gelen data ise

3- 11 02 65 34 10 00 00 01

Yani ikinci paketin ilk kısmı yukarıda verdiğim örnekteki gibi birinci paketle aynı. Karşıdaki cihazdan sadece 3 numaralı satırda belirttiğim data gelmesine rağmen, ben uart'dan okuma yapınca ikinci satırda yazıldığı gibi datayı okuyorum. Yani ilk gelen (1 numaralı satır) paket sanki uart'dan silinmemiş ve sonradan gelen data da devamına yazılmış gibi.

Böyle bir sorunla karşılaşan oldu mu daha önce? Bu sorun nadiren oluşuyor ama bir kez oldu mu bir daha haberleşme düzelmiyor. Reset atmak zorunda kalıyorum.
Başlık: Ynt: esp32 uart
Gönderen: mehmet - 28 Ekim 2022, 22:17:44
Keşke kodlarınızı, şemanızı, vb. diğer
materyalleri paylaşmış olsaydınız.
Başlık: Ynt: esp32 uart
Gönderen: mr.engineer - 29 Ekim 2022, 20:29:51
void UartInit(void)
{
/* UART1 Configuration*/
        uart_config_t uart_config = {
        .baud_rate = 115200,
        .data_bits = UART_DATA_8_BITS,
        .parity = UART_PARITY_DISABLE,
        .stop_bits = UART_STOP_BITS_1,
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
        .source_clk = UART_SCLK_APB,
    };
    //Install UART driver, and get the queue.
    ESP_ERROR_CHECK(uart_driver_install(EX_UART_NUM, BUF_SIZE * 2, BUF_SIZE * 2, 20, &uart1_queue, 0));

    ESP_ERROR_CHECK(uart_param_config(EX_UART_NUM, &uart_config));
   
    ESP_ERROR_CHECK(uart_set_pin(EX_UART_NUM, 43, 44, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
    //Create a task to handler UART event from ISR
    xTaskCreate(uart_task, "uart_task", 2048, NULL, 2, NULL);

}

static void uart_task(void *pvParameters)
{
    uart_event_t event;
    uint8_t* received_data_from_cmd = (uint8_t*) malloc(BUF_SIZE);
   

    for(;;) {
        //Waiting for UART event.
        if(xQueueReceive(uart1_queue, (void * )&event, (portTickType)portMAX_DELAY)) {
            bzero(received_data_from_cmd, BUF_SIZE);
            uart_read_bytes(UART_NUM_1, received_data_from_cmd, event.size, portMAX_DELAY);

            #if 1
            printf("D--> ");
            for(int i = 0; i<event.size; ++i)
                printf("%x ", received_data_from_cmd[i]);
            printf("\n");
            #endif
           

            uint16_t i=0;
            while(i < event.size)
            {
                ProcessReceivedBytes(received_data_from_cmd[i]);                   
                i++;
            }
            i = 0;
        }
    }
    free(received_data_from_cmd);
    received_data_from_cmd = NULL;
    vTaskDelete(NULL);
}

Şematik paylaşmadım elimde yok zaten iki cihaz arasında sadece TX/RX bağlantısı var. Donanımla ilgili bir sorun olduğunu düşünmüyorum.

Başlık: Ynt: esp32 uart
Gönderen: fide - 30 Ekim 2022, 15:07:48
Konu hazır açılmışken ben de esp32 uart ile ilgili bir şey sorayım. Bildiğim kadarıyla 2 uart var ama uartın birinden console verileri de geliyor yada programlama yapılıyor. Bu bağlamda esp32 üzerinde ayrık olarak 2 uartı programlama / debug haricinde kullanmam mümkün mü?
Başlık: Ynt: esp32 uart
Gönderen: mr.engineer - 30 Ekim 2022, 15:47:49
Alıntı yapılan: fide - 30 Ekim 2022, 15:07:48Konu hazır açılmışken ben de esp32 uart ile ilgili bir şey sorayım. Bildiğim kadarıyla 2 uart var ama uartın birinden console verileri de geliyor yada programlama yapılıyor. Bu bağlamda esp32 üzerinde ayrık olarak 2 uartı programlama / debug haricinde kullanmam mümkün mü?

Evet mümkün menuconfig'den component config-->esp system setting-->channel for console ouput seçeneğini none olarak işaretleyin. Daha sonra yazılımda console output için kullanılan UART'ı (muhtemelen UART0) kendi ayarlarınıza göre init edin
Başlık: Ynt: esp32 uart
Gönderen: fide - 30 Ekim 2022, 16:45:19
Micropython kullanıcaz. Bahsettiğiniz ayarların Micropython'da olduğunu sanmıyorum.
Başlık: Ynt: esp32 uart
Gönderen: mr.engineer - 30 Ekim 2022, 17:19:41
Python ile nasıl kullanıyorsunuz bilgim yok. Cihazın default config ayarlarıyla UART0 console output olarak ayarlanıyor. ESP-IDF kullanıyorum ve build işlemi sonrası o ayarlara göre macroların olduğu .h uzantılı dosya üretiyor. Ordan da değiştirilebilir ama python'da işler nasıl hiç bilmiyorum.
Başlık: Ynt: esp32 uart
Gönderen: fide - 30 Ekim 2022, 19:44:39
Kolay olduğu için Micropython kullanıyorum. Hiçbirşey bilmeniz gerekmiyor. Pinout ve fonksiyonel pinleri bilmek yeterli. Herşey hazır fonksiyon.