esp32 uart

Başlatan mr.engineer, 28 Ekim 2022, 22:03:07

mr.engineer

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.

mehmet

Keşke kodlarınızı, şemanızı, vb. diğer
materyalleri paylaşmış olsaydınız.
Olan olmuştur, olacak olan da olmuştur. Olacak bir şey yoktur. http://www.mehmetbilgi.net.tr

mr.engineer

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.


fide

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ü?
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

mr.engineer

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

fide

Micropython kullanıcaz. Bahsettiğiniz ayarların Micropython'da olduğunu sanmıyorum.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

mr.engineer

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.

fide

Kolay olduğu için Micropython kullanıyorum. Hiçbirşey bilmeniz gerekmiyor. Pinout ve fonksiyonel pinleri bilmek yeterli. Herşey hazır fonksiyon.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com