Nevets
Nevets

Reputation: 315

Read and Store Bytes from Serial Port

I am trying to create a RS232 application that reads incoming data and stores it in a buffer. I found the following code in an RS232 example but I am not sure how to use it

*RS232 Example port_DataReceived*

    private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        if (!comport.IsOpen) return;

        if (CurrentDataMode == DataMode.Text)
        {
            string data = comport.ReadExisting();

            LogIncoming(LogMsgType.Incoming, data + "\n");
        }
        else
        {
            int bytes = comport.BytesToRead;

            byte[] buffer = new byte[bytes];

            comport.Read(buffer, 0, bytes);

            LogIncoming(LogMsgType.Incoming, ByteArrayToHexString(buffer) + "\n");

        }
    }

I am trying to write another method that takes an incoming byte array and combines it with another array ... see below:

private void ReadStoreArray()
{
   //Read response and store in buffer
   int bytes = comport.BytesToRead;
   byte[] respBuffer = new byte[bytes];
   comport.Read(respBuffer, 0, bytes);   

   //I want to take what is in the buffer and combine it with another array
   byte AddOn = {0x01, 0x02}
   byte Combo = {AddOn[1], AddOn[2], respBuffer[0], ...};
}

I currently have both methods in my code as I am confused how to read and store the incoming bytes to the port. Can I use the "port_DataReceived" method in my "ReadStoreArray" method? Do I need to modify my "ReadStoreArray" method? Or should I just start over?

Upvotes: 5

Views: 45651

Answers (4)

Arun kumar
Arun kumar

Reputation: 11

If you have a delimiter you can check for the delimiter and read the next amount of the data buffer required.

byte[] RawData;
        try
        {
            SerialPort serialPort = new SerialPort("COM11", 230400);
            serialPort.ReadTimeout = 1000;
            serialPort.WriteTimeout = 1000;
            if (serialPort.IsOpen) serialPort.Close();
            serialPort.Open();

            using (var binaryReader = new BinaryReader(serialPort.BaseStream))
            {
                //while (!FindForDelimiter(binaryReader))
                //{
                //    Thread.Sleep(1);
                //    //FindForDelimiter(binaryReader);
                //}

                while (serialPort.IsOpen)
                {
                    try
                    {
                        RawData = binaryReader.ReadBytes(5);
                        for (int offset = 0; offset < RawData.Length; offset += 5)
                        {
                            ulong lasttime = BitConverter.ToUInt32(RawData, 0);
                            Console.WriteLine(lasttime);
                        }
                    }
                    catch
                    {

                    }
                }

            }

In mine, i have requirement to find the delimiter its works my use case

Upvotes: 1

Docmur
Docmur

Reputation: 346

Don't bother with using the DataRecieve handler, it's horribly inaccurate, you're better off to start a thread which constantly reads the serial port and grabs every byte which comes across it.

Upvotes: 3

001
001

Reputation: 13533

When you create your SerialPort:

SerialPort comport = new SerialPort("COM1");
comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // Shortened and error checking removed for brevity...
    if (!comport.IsOpen) return;
    int bytes = comport.BytesToRead;
    byte[] buffer = new byte[bytes];
    comport.Read(buffer, 0, bytes);
    HandleSerialData(buffer);
}

//private void ReadStoreArray(byte[] respBuffer)
private void HandleSerialData(byte[] respBuffer)
{
   //I want to take what is in the buffer and combine it with another array
   byte [] AddOn = {0x01, 0x02}
   byte [] Combo = {AddOn[1], AddOn[2], respBuffer[0], ...};
}

Upvotes: 8

Ben Voigt
Ben Voigt

Reputation: 283624

You can't read the same data from the port twice. You'll need to read it once into a buffer, then either share the buffer (pass as a function parameter) or clone it to give each function its own copy.

Upvotes: 1

Related Questions