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.
b707
November 30, 2022, 11:24am
2
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';