Receiving Garbage value from OBD vinArray

im try to get vin array 17 charator from car, normaly i all good but when i start car engine obd can line sending garbusge and i recive data lke ths ." WBSWD93549PY43903?!~,A^ "

vin_arr[16] = from_car->data.uint8[7];

i revice data from this function. and

char vin_arr[17];
.how can i filter array . and sending to other funtion..
im using esp32 controller with builtin CAN.

What it is?
Do you really use uint8_t as name of the data field?
Please show your full code

not sure, but something along those lines might work:

/*
https://github.com/miwagner/ESP32-Arduino-CAN
https://en.wikipedia.org/wiki/OBD-II_PIDs#Service_09_-_Request_vehicle_information
*/
#include <Arduino.h>
#include <ESP32CAN.h>
#include <CAN_config.h>

CAN_device_t CAN_cfg;               // CAN Config
const int rx_queue_size = 10;       // Receive Queue size
CAN_frame_t VIN_Req_Frame;
char VIN_arr[20] = {0};
uint8_t j = 0;

void setup() {
  Serial.begin(115200);
  CAN_cfg.speed = CAN_SPEED_500KBPS;
  CAN_cfg.tx_pin_id = GPIO_NUM_5;
  CAN_cfg.rx_pin_id = GPIO_NUM_4;
  CAN_cfg.rx_queue = xQueueCreate(rx_queue_size, sizeof(CAN_frame_t));
  // Init CAN Module
  ESP32Can.CANInit();

  VIN_Req_Frame.FIR.B.FF = CAN_frame_std;
  VIN_Req_Frame.MsgID = 0x7DF;
  VIN_Req_Frame.FIR.B.DLC = 8;
  VIN_Req_Frame.data.u8[0] = 0x02;
  VIN_Req_Frame.data.u8[1] = 0x09;
  VIN_Req_Frame.data.u8[2] = 0x02;
  VIN_Req_Frame.data.u8[3] = 0xff;
  VIN_Req_Frame.data.u8[4] = 0xff;
  VIN_Req_Frame.data.u8[5] = 0xff;
  VIN_Req_Frame.data.u8[6] = 0xff;
  VIN_Req_Frame.data.u8[7] = 0xff;

  ESP32Can.CANWriteFrame(&tx_frame);
}

void loop() {

  CAN_frame_t rx_frame;

  unsigned long currentMillis = millis();

  // Receive next CAN frame from queue
  if (xQueueReceive(CAN_cfg.rx_queue, &rx_frame, 3 * portTICK_PERIOD_MS) == pdTRUE) {

    if (rx_frame.MsgID == 0x7E8) { //this is the typical reply CAN ID to OBDII requests
      if (rx_frame.data.u8[0] == 0x10) {
        for (int i = 4; i < rx_frame.FIR.B.DLC; i++) {
          VIN_arr[j++] = rx_frame.data.u8[i];
        }
      }
      else if (j < sizeof(VIN_arr)) {
        for (int i = 1; i < rx_frame.FIR.B.DLC; i++) {
          VIN_arr[j++] = rx_frame.data.u8[i];
        }
      }
    }
  }
  // Send CAN Message
  if (millis() - previousMillis >= interval) {
    previousMillis = millis();

    printf("%s\n", VIN_arr);

    j = 0;
    memset(VIN_arr, 0, sizeof(VIN_arr))


    ESP32Can.CANWriteFrame(&VIN_Req_Frame);
  }
}

hope that helps....

oky itry memset funtion . but dont undertande how get garbage even i declare only 17 char array. and when show array i receive 20 to 22 char 17 right and other 3,4 garbage.

/////////////////////
if(from_car->data.uint8[2] == 0x49 && vinFlag == 1){
vin_arr[0]  = from_car->data.uint8[5];
vin_arr[1]  = from_car->data.uint8[6];
vin_arr[2]  = from_car->data.uint8[7];
vinFlag++;
//Serial.print(">> ");Serial.println(vinFlag);
}
if(from_car->data.uint8[0] == 0x21 && vinFlag == 2){
vin_arr[3]  = from_car->data.uint8[1];
vin_arr[4]  = from_car->data.uint8[2];
vin_arr[5]  = from_car->data.uint8[3];
vin_arr[6]  = from_car->data.uint8[4];
vin_arr[7]  = from_car->data.uint8[5];
vin_arr[8]  = from_car->data.uint8[6];
vin_arr[9]  = from_car->data.uint8[7];
vinFlag++;
//Serial.print(">> ");Serial.println(vinFlag);
}
if(from_car->data.uint8[0] == 0x22 && vinFlag == 3){
vin_arr[10] = from_car->data.uint8[1];
vin_arr[11] = from_car->data.uint8[2];
vin_arr[12] = from_car->data.uint8[3];
vin_arr[13] = from_car->data.uint8[4];
vin_arr[14] = from_car->data.uint8[5];
vin_arr[15] = from_car->data.uint8[6];
vin_arr[16] = from_car->data.uint8[7];
//Serial.print(">> ");Serial.println(vin_arr[0]);
//Serial.print(">> ");Serial.println(vin_arr[1]);
Serial.print(">>>> ");Serial.println(String(vin_arr));
vinFlag=0;
}

That is more than 17 characters so I think you are going off the end of your array. Did you add a terminating null character before treating your buffer as a string?

You need to make the array one character longer to have room for a 17-character string AND a null terminator.

char vin_arr[18];
vin_arr[17] = '\0';