Thanks to you all for your answers.
I think I will try again Hardware Serial. First time I tried it was with Atmega328p and it failed. Then when I upgraded to Mega2560 I did not try again because the software was very stable then. But since I have to rewrite half of the program (LCD panel is going to be replaced by a 5" TFT display so the whole HMI must be rewritten) there is space for many tests
However here is the software (for Atmega2560):
http://luca72.xoom.it/td5mapsuiteweb/archive/td5opencom/td5opencom11q.zip
OBD2 communication management is in file td5comm.cpp, this is the read/write part:
boolean Td5Comm::read_byte(byte * b)
{
 int readData;
 boolean success = true;
 byte t=0;
 //digitalWrite(ledPin, HIGH);
 while(t != READ_ATTEMPTS && (readData=obdSerial.read())==-1)
 {
  delay(1);
  t++;
 }
 //digitalWrite(ledPin, LOW);
 if (t >= READ_ATTEMPTS)
 {
  success = false;
 }
 if (success)
 {
  *b = (byte) readData;
 }
 return success;
}
void Td5Comm::write_byte(byte b)
{
 //digitalWrite(ledPin, HIGH);
 obdSerial.write(b);
 delay(Td5RequestByteDelay); // ISO requires 5-20 ms delay between bytes.
 //digitalWrite(ledPin, LOW);
}
If somebody can give me some suggestions they are very welcomed
Thanks again,
Luca