Page 1 of 3

ESP32/UART : Buffer is null

Posted: Thu Apr 01, 2021 9:49 am
by BiHan90
Hello guys,

I'm testing the UART connection between ESP32 (as receiver) and a PIC microcontroller (transmitting an integer). The code below is for the ESP32 side in order to configure it for the UART reception.

[Codebox]
#include <stdio.h>
#include <esp_vfs_fat.h>
#include <esp_modbus_slave.h>
#include <esp_err.h>
#include "UART.h"

void app_main() {
int len = 0;
int data = 0;
const int uart_buffer_size = (1024*2);
const int uart_num = UART_NUM_2;

uart_config_t uart_config = {
.baud_rate = 9600,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
.rx_flow_ctrl_thresh = 122,
.source_clk = UART_SCLK_APB,
};
// Configure UART parameters

uart_param_config(uart_num, &uart_config);
uart_set_pin(uart_num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
uart_driver_install(uart_num, uart_buffer_size, 0, 0, NULL, 0);

while (1) {
ESP_ERROR_CHECK(uart_get_buffered_data_len(uart_num, (size_t*)&len));
// Read data from the UART
len = uart_read_bytes(uart_num, data, uart_buffer_size, 20 / portTICK_RATE_MS);
printf("data is %d", data);

// Write data back to the UART
uart_write_bytes(uart_num, (const char *) data, len);
}
}[/Codebox]


After building and flushing, the buffer always reads null :

E (1875) uart: uart_read_bytes(1155): uart data null
E (1885) uart: uart_write_bytes(1122): buffer null


Could you please highlight where the issue is ?
Thanks in advance :)

Re: ESP32/UART : Buffer is null

Posted: Thu Apr 01, 2021 6:28 pm
by WiFive

Code: Select all

int data = 0;

Re: ESP32/UART : Buffer is null

Posted: Fri Apr 02, 2021 9:06 pm
by BiHan90
Thanks @WiFive for your reply..

So i initialized (data) as follows : int *data = (int *) malloc(uart_buffer_size);

but the output is now nothing :-
data is
data is
data is
data is
data is
data is

How is that possible ?

Re: ESP32/UART : Buffer is null

Posted: Sat Apr 03, 2021 1:04 pm
by ESP_Sprite
What does your code look like now?

Re: ESP32/UART : Buffer is null

Posted: Sun Apr 04, 2021 9:42 am
by BiHan90
Hi @ESP_Sprite,

It's the same code, i just replaced : (Int data = 0) By (int *data = (int *) malloc(uart_buffer_size);)

Re: ESP32/UART : Buffer is null

Posted: Mon Apr 05, 2021 2:29 am
by ESP_Sprite
That doesn't make sense. That printf line should still print out "data is [a number]". The number will be bullshit as you're trying to print out the pointer to the data instead of the data itself, but it should give you a number.

Re: ESP32/UART : Buffer is null

Posted: Mon Apr 05, 2021 10:13 am
by BiHan90
@ESP_Sprite.. So, i let the pic transmits a letter (uint8_t) instead of an integer and the final code is as below:

Code: Select all

void app_main() {
    int len;
    int uart_buffer_size = (1024*2);
    const int uart_num = UART_NUM_2;
    uint8_t data[128];

    uart_config_t uart_config = {
            .baud_rate = 9600,
            .data_bits = UART_DATA_8_BITS,
            .parity = UART_PARITY_DISABLE,
            .stop_bits = UART_STOP_BITS_1,
            .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
            .rx_flow_ctrl_thresh = 122,
            .source_clk = UART_SCLK_APB,
    };
    // Configure UART parameters

    uart_param_config(uart_num, &uart_config);
    //QueueHandle_t uart_queue;
    uart_set_pin(uart_num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
    uart_driver_install(uart_num, uart_buffer_size, 0, 0, NULL, 0);

    while (1) {
        ESP_ERROR_CHECK(uart_get_buffered_data_len(uart_num, (size_t*)&len));
        // Read data from the UART
        len = uart_read_bytes(uart_num, data, uart_buffer_size, 20 / portTICK_RATE_MS);

        printf("data is %s\n", data);
        fflush(stdout);
    }
}
But the output now is : data is ����������������

Could you please just show me how to print the letter correctly instead of this ?

Re: ESP32/UART : Buffer is null

Posted: Tue Apr 06, 2021 4:05 am
by ESP_Sprite
Now you're trying to print a integer array as a string... and I can't tell you how to print your data as you never told us what information you're receiving from the UART in the first place. It may help if you also post the PIC code that sends the data.

Re: ESP32/UART : Buffer is null

Posted: Tue Apr 06, 2021 7:21 am
by BiHan90

Code: Select all

#define _XTAL_FREQ 16000000
/*
 * Includes
 */

#include <xc.h>
#include <stdint.h>
#include<stdlib.h>

/*
 * Prototypes
 */
void initChip(void);

/*
 * Global Variables
 */

/*
 * Functions
 */
void initChip(void)
{
//CLK settings
OSCTUNE = 0x80; //3X PLL ratio mode selected
OSCCON = 0x70;  //Switch to 16MHz HFINTOSC
OSCCON2 = 0x10; //Enable PLL, SOSC, PRI OSC drivers turned off
while(OSCCON2bits.PLLRDY != 1); //Wait for PLL lock
ACTCON = 0x90;  //Enable active clock tuning for USB operation
ANSELA = 0x00;

    PORTA = 0x00;           //Initial PORTA   
    TRISA = 0b00000000;     //Define PORTA as output  
    CM1CON0 = 0x00;         //Turn off Comparator        
    PORTB = 0x00;           //Initial PORTB   
    TRISB = 0x00;           //Define PORTB as output
    PORTC = 0x00;           //Initial PORTC
    TRISC = 0x00;           //Define PORTC as output
}
//--------------------------------
// Function Declarations
void UART_TX_Init(void);
void UART_Write(uint8_t);


// Main Routine
void main(void) 
{
  //--[ Peripherals & IO Configurations ]--
  initChip();
  UART_TX_Init(); // Initialize The UART in Master Mode @ 9600bps
  //---------------------------
  while(1)
  {
      _delay(100);
      UART_Write('p');
  } 
  return;
}
//--------------------------------
// Functions Definitions
void UART_TX_Init(void)
{
  TXSTA1bits.SYNC = 0;
  RCSTA1bits.SPEN = 1;
  TXSTA1bits.BRGH = 0; // Set For High-Speed Baud Rate
  BAUDCON1bits.BRG16 = 0;
  SPBRG1 = 25; // Baud rate will be set to 115.200 bps (9600bps for now)
  
  
  // Set The RX-TX Pins to be in UART mode 
  TRISCbits.RC6 = 1;  //Tx
  TRISCbits.RC7 = 1;  //Rx
  TXSTA1bits.TXEN = 1; // Enable UART Transmission
}
void UART_Write(uint8_t data)
{
  while(!TXSTA1bits.TRMT);  // While TSR register is not empty 
  TXREG1 = data;            // Load the data to the transmit buffer
}
This is the code I'm using for the PIC in order to transmits the letter 'p'...

Re: ESP32/UART : Buffer is null

Posted: Tue Apr 06, 2021 11:02 am
by ESP_Sprite
Okay, in that case you're *almost* doing it right. The issue is that printf expects a zero-terminated string, and your PIC isn't sending one of those, so you'll need to zero-terminate it. Solution is to do something like 'data[len]=0;' to zero-terminate the end of the string.

Note that you added a timeout of 20mS to uart_read_bytes, though. Depending on how long '_delay(100);' in your PIC code delays, you may get some lines with no response at all interspersed with P's.

Edit: Ah, and what is the line ' ESP_ERROR_CHECK(uart_get_buffered_data_len(uart_num, (size_t*)&len));' doing in your code? You're not using the result of that anyway, suggest you delete that.