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.
Keşke kodlarınızı, şemanızı, vb. diğer
materyalleri paylaşmış olsaydınız.
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.
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ü?
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
Micropython kullanıcaz. Bahsettiğiniz ayarların Micropython'da olduğunu sanmıyorum.
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.
Kolay olduğu için Micropython kullanıyorum. Hiçbirşey bilmeniz gerekmiyor. Pinout ve fonksiyonel pinleri bilmek yeterli. Herşey hazır fonksiyon.