The serial lib has only 2 functions, 'send' and 'data arrived'.
I think that's a reflection of Android and event-driven programming. Also, what else do you do with a serial port, besides send and receive?
Most libs have functions of receive 1 byte, how many bytes arrived, etc.
I cheerfully concede that you have to take the data Android gives you, when it gives it to you, ie you can't meter it out by asking for it in quantities and at times that suit you. But that's no big deal: you just add it to your own buffer, which can be as big as a B4X String can be eg MB+ and then dice it off from that as you need it.
The input buffer size is about 2K bytes so you need to know what's going on in there.
I wouldn't know about that, I think I've always had my own buffers. Although maybe I do that instinctively because I got burned early on relying on third-party buffers, and I've been blissfully and unknowingly dodging that bullet ever since. I do vaguely remember fighting some battles with Turbo Basic in 1987, before jumping ship to Turbo C.
In BASIC the buffer is usually a String, or in the case of fixed (or known maximum) length binary packets coming in fast, I'll use an array of bytes.
The only way I can convert this message to integers is by manipulating strings.
Because the ELM device is talking to you in text (eg "2C" being ASCII characters Chr(0x32) & Chr(0x43) rather than a single byte 0x2C, I agree that strings are an entirely reasonable way to go here.
Next I'll try ISO-8859-1.
When you're receiving byte-size data from machines that don't use Unicode anyway,
ISO-8859-1 is the decoding to use:
it maps byte value 0 = Chr(0), byte value 1 = Chr(1), etc all the way to byte value 255 = Chr(255).
Windows 1252 does some oddball mappings in the high-bit area, to maximise the number of useful characters available for day-to-day real-life typing eg the Euro symbol which is Chr(8364), and smart single and double quotes.