Skocz do zawartości

Problem z obsługą UART ESP32


no__name

Pomocna odpowiedź

Piszę kod na Ardu Nano, z powodu braku miejsca muszę przesiąść się na coś " większego " , padło na ESP32 WeMos LOLIN32 . Pojawiły się problemy, sketch nie działa. Największy problem mam z obsługą bufora uart. Odbieram wszystko od mojego 81,10,F1 ... a potrzebuje odebrać tylko odpowiedź ECU. W arduino NANO działało mi to poprawnie , funcja uart_read czytała bez echa, w ESP po odpaleniu programu nie mam tylko danych " potrzebnych " mam cały stream ... Z Serial.print(buf[a],HEX); mam : 110F18133C1D58F28A0D22CFFFF ..... Dziękuję i pozdrawiam .

#include "HardwareSerial.h"
#include <Arduino.h>
HardwareSerial portECU(1);
# define pc_baud 115200
# define ecu_baud 10400
void setup() {
Serial.begin(pc_baud);
// portECU.begin(ecu_baud,SERIAL_8N1,12,14); // W ESP32 musi byc zadeklarowany parametr protocol !
while (!Serial) ;
Serial.println(" Serial OK ! ");
Serial.println(" 1. Read fault codes ");
}
int wyb=0;
int pin_tx = 17; //////////// PIN TX UART /////////////////////////////////////////////
uint8_t buf[20];
char m1[] = {0x81, 0x10, 0xf1, 0x81, 0x03}; //init komunikacji
char m2[] = {0x02, 0x27, 0x03, 0x2c}; // zapytanie o zagadke.
void loop() {
while (!Serial.available() );
{
wyb = Serial.read();
}
if ( wyb==49) ////////// start diag - przycisk 1
{
ecu_init();
portECU_conf();
portECU.write(m1,5);
delay (20);
portECU.write(m2,4);
delay (20);
uart_read();
}
}
void uart_read ()
{
int a = 0 ;
char ile_odczytac = 1 ; ////// /zmienilem wszystkie typy z uint_8 na char
char CRC = 0;
char CRC2 = 0;
char CRC_check=0;
if (portECU.available() )
{
for (a = 0; a < ile_odczytac; a++) {
buf[a]= portECU.read();
ile_odczytac = (buf[0]+ 2); // odczyt z crc
CRC = CRC + buf[a];
Serial.print(buf[a],HEX);
}
CRC2 = CRC - buf[(ile_odczytac)-1 ] ;
CRC_check = CRC - CRC2 ;
Serial.print( CRC2 ,HEX);
delay (3);
}
if (CRC2 != CRC_check ) {
Serial.println ( " CRC NOT OK! " );
}
}
void ecu_init () // Fast init na porcie ardu, 30 ms reset linii, potem 25ms HIGH i 25ms LOW , w razie potrzeby wyrzucic z funkcji czas do edycji w loop
{
pinMode(pin_tx, OUTPUT);
digitalWrite(pin_tx, HIGH);
delay(30);//in ms 1
digitalWrite(pin_tx, LOW);
delay(25); //in ms 0
digitalWrite(pin_tx, HIGH);
delay(25); //in ms 1
}
void portECU_conf ()
{
portECU.begin(ecu_baud,SERIAL_8N1,16,17); // W ESP32 musi byc zadeklarowany parametr protocol ! RX 16,TX 17
}

 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.