convert serialport.readline() non-ascii string int

2019-08-30 11:25发布

问题:

I want to use serialport.readline() because it's a blocking call and the data I'm getting has 0x0D 0x0A (CR LF) at the end. However, what I want is an Hex String instead of an Ascii representation.

For example, the device I am communication with is sending byte arrays like {0xff,0xff,0x45,0x0D,0x0A}. I want to simply print out in my program just like this: 0xff, 0xff,0x45. Readline() kindly trims out LF and CR.

I though about using serialport.read(buff[]...) by specifying how many bytes I want to read. But it didn't work very well because if I am reading too fast half of the array will be 0x00 and if I am reading too slow, there will be an overflow for the com port. I don't want to lose any bytes.

I tried to convert what I got from serialport.readline() to a byte array but the hex string I got usually turns into 0x3f. Code is like this:

var line = string.Join(",", mySerialPort.ReadLine().Select(c => ((Byte)c).ToString("X")).ToArray());

I changed the encoding a few times (ASCII, UTF8,UNICODE) but still no go.

Is there any way to convert the non-Ascii String I got from readline() into a byte array?

回答1:

It sounds like you shouldn't be reading it as text data at all.

You're fundamentally dealing with binary data, so use the overload of Read which takes a byte array rather than a char array. (Or call ReadByte repeatedly.)

Any time you try to treat arbitrary binary data as if it's text, you're going to have a bad experience.

It sounds like you've already tried this, but done it badly:

But it didn't work very well because if I am reading too fast half of the array will be 0x00

That suggests you're ignoring the return value of Read, which says how many bytes have actually been read. You should have something like:

int bytesRead = port.Read(buffer, 0, buffer.Length);
// Now use the portion of buffer which is from 0 (inclusive) to
// bytesRead (exclusive).