skomi
skomi

Reputation: 145

SerialPort read just first character of string

I create small test app to test connection between app and some device which measure temperature. When I write some command to device it's ok, but when device return me response, a string, for that I use ReadExisting() method. But app reads just first character of the string. If I send command again, it's same situation. I try to test connection with program called Terminal.exe, it's happens the same. But when I change BaudRate at some value and return BaudRate on 9600 ( it's ok rate ), then it's worked fine. Also I try to change BaudRate in my app, but it give me the same, just first character of string. Also I have an app written in LabView which works fine.

Also I tested my app with another PC with Terminal.exe , and it's worked fine.

private void SetUpPort()
    {
        port = new SerialPort();
        port.PortName = port_name;
        port.BaudRate = 9600;
        port.Parity = Parity.None;
        port.DataBits = 8;
        port.StopBits = StopBits.One;
        port.Handshake = Handshake.None;
        port.ReadTimeout = 1000;
        p.DataReceived += new SerialDataReceivedEventHandler(PortDataReceived);
    }
private void PortDataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        recived_data += port.ReadExisting();
    }

I would be very thankful for any help.

Upvotes: 0

Views: 1690

Answers (2)

Thorsten Dittmar
Thorsten Dittmar

Reputation: 56697

That is not how to use the SerialPort component. You need to attach the DataReceived event handler, which is called every time data comes in on the serial port. An example is found on the page I linked.


You need to append data until you know you're done! You can't just call ReadExisting and assume you get all the information. Do something like this:

private string inBuffer = String.Empty;

private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();

    inBuffer += indata;
    if (<inBuffer fulfills some criteria that tells you it's a complete message>)
    {
        ProcessInBuffer(inBuffer);
        inBuffer = String.Empty;
    }
}

It is your task to determine the criteria to fulfill. This may be that the received data as a certain length (if the records are fixed length), or maybe they end with newline characters or something else.

Upvotes: 2

Antho
Antho

Reputation: 191

you will use datareceived event to store all the data in a array or string and after you can use every data of that string indata += sp.ReadExisting();

Upvotes: 0

Related Questions