user594810
user594810

Reputation: 149

received byte never over 127 in serial port

I have a program that sends a stream bytes to eother pc. The values range from 0 to 255. I set up my serialport like this

sp.BaudRate = 115200;
sp.PortName = "COM53";
sp.DataBits = 8;
sp.StopBits = System.IO.Ports.StopBits.One;
sp.Parity = System.IO.Ports.Parity.None;
sp.ReadTimeout = 0;
sp.Open();
sp.DataReceived += new
System.IO.Ports.SerialDataReceivedEventHandler(sp_ DataReceived);

and then I have this

void sp_DataReceived(object sender,
System.IO.Ports.SerialDataReceivedEventArgs e)
{

string Mystring = sp.ReadExisting();
byte testbyte = 254;
// Gather all the bytes until 102 is reached
foreach (byte c in Mystring)
{
if(pixelcount<102)
pixel[pixelcount] = c;
pixelcount++;
if (c 126)
Console.WriteLine("big number {0}", c);// biggest number ever printed is 127
}
//got all the bytes, now draw them
if (pixelcount == 102)
{
Console.WriteLine("testbyte = {0}", testbyte);
oldx = 0;
pixelcount = 0;
pictureBox_rawData.Invalidate();
}
}

My problem is that "c" is never over 127. What am I missing here? i've test all encoding but i can not solve this problem. please help.

thanks int91h

Upvotes: 1

Views: 4252

Answers (4)

Cary Bondoc
Cary Bondoc

Reputation: 2988

Just as what Hans Passant said, you need to use SerialPort.Read().

Something like this would work

'retrieve number of bytes in the buffer
Dim bytes1 As Integer = ComPort.BytesToRead

'create a byte array to hold the awaiting data
Dim comBuffer As Byte() = New Byte(bytes1 - 1) {}

'read the data and store it to comBuffer
ComPort.Read(comBuffer, 0, bytes1)

Upvotes: 0

Hans Passant
Hans Passant

Reputation: 941635

You are not reading bytes, you are reading text. Which is produced by converting the bytes that the port receives according to the SerialPort.Encoding property value. Which defaults to Encoding.ASCII, an encoding that only has characters for byte values 0 through 127. Byte values out of that range are replaced by the "?" character.

Which explains what you see. Choosing another Encoding is an unlikely solution in your case, use SerialPort.Read() instead. The equivalent of ReadExisting is calling Read() with a sufficiently large count argument. You'll get back whatever fits, the actual number of bytes copied into the buffer is the method return value. It blocks when the input buffer is empty. Which can only happen in the DataReceived event handler when e.EventType is not equal to SerialData.Chars. Not usually a problem.

Beware that your call to pictureBox_rawData.Invalidate() is invalid. DataReceived runs on a threadpool thread. You can only touch control members on the UI thread. You'll need to use Control.BeginInvoke().

Upvotes: 3

PetPaulsen
PetPaulsen

Reputation: 3508

In the documentation for SerialPort.Write (Remarks section):

By default, SerialPort uses ASCIIEncoding to encode the characters. ASCIIEncoding encodes all characters greater then 127 as (char)63 or '?'. To support additional characters in that range, set Encoding to UTF8Encoding, UTF32Encoding, or UnicodeEncoding.

Maybe ReadExisting behaves similar and converts every byte greater then 127 to 63.

Upvotes: 3

Jim Mischel
Jim Mischel

Reputation: 134005

If you want to get the raw bytes, you should be using SerialPort.Read to read it into a byte array. Using SerialPort.ReadExisting to read the data into a string is going to force a conversion of some kind (i.e. encoding will convert bytes to chars).

Upvotes: 6

Related Questions