Question

I am writing a C# application to read from several serial COM ports at the same time to analyze the data communication of an IPOD. The data being sent needs to be interpreted as HEX bytes. For example,

0xFF 0x55 0x01 0x00 0x04 0xC3 0xFF 0x55 ...

I want to be able to read this and display it in a rich textbox, for example

0xFF 0x55 0x01 0x00 0x04 0xC3
0xFF 0x55 ... 

The start of a command includes a header (0xFF 0x55) and the rest is is the command + parameters + checksum.

What is the best way to go about this?

I currently have:

private delegate void SetTextDeleg(string text);

void sp_DataReceivedRx(object sender, SerialDataReceivedEventArgs e)
{
    Thread.Sleep(500);
    try
    {
        string data = IPODRxPort.ReadExisting(); // Is this appropriate??
        // Invokes the delegate on the UI thread, and sends the data that was received to the invoked method.
        // ---- The "si_DataReceived" method will be executed on the UI thread which allows populating of the textbox.
        this.BeginInvoke(new SetTextDeleg(si_DataReceivedRx), new object[] { data });
    }
    catch
    { }
}

private void si_DataReceivedRx(string data)
{
    int dataLength = data.Length*2;
    double numLines = dataLength / 16.0;
    for (int i = 0; i < numLines; ++i)
        IPODTx_rtxtBox.Text += "\n";

    IPODRx_rtxtBox.Text += SpliceText(convertAsciiTextToHex(data), 32) + "\n"; 
}

I can read data, but it is not in the appropriate format.

Im just not sure what the best way to get the hex data from the com port and display it line by line by command based on the command header (0xFF 0x55).

Any Suggestions?

Was it helpful?

Solution

Alex Farber's method works. Below is my code example:

SerialPort sp = (SerialPort) sender;
// string s = sp.ReadExisting();
// labelSerialMessage.Invoke(this.showSerialPortDelegate, new object[] { s });

int length = sp.BytesToRead;
byte[] buf = new byte[length];

sp.Read(buf, 0, length);
System.Diagnostics.Debug.WriteLine("Received Data:" + buf);

labelSerialMessage.Invoke(this.showSerialPortDelegate, new object[] { 
    System.Text.Encoding.Default.GetString(buf, 0, buf.Length) });
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top