tags:

views:

160

answers:

1

I am using the below code to receive the message via serial port which is working fine. Now i need to send back a acknowledgment message to the sender machine. How can send the message ?

       private void MonitorSP_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        try
        {
            System.IO.Ports.SerialPort SP = (System.IO.Ports.SerialPort)sender;

            //Get the ports available in system
            string[] theSerialPortNames = System.IO.Ports.SerialPort.GetPortNames();
            string strAvlPortNames = "";
            foreach (string s in theSerialPortNames)
            {
                strAvlPortNames += s.ToString() + ", ";
            }

            //Read an contruct the message
            Thread.Sleep(1000);
            string msg = SP.ReadExisting();
            string ConstructedMsg = "Port's Found : " + strAvlPortNames + "\n" + "Port Used : " + SP.PortName + "\n" + "Message Received : " + msg;

            if (InvokeRequired)
            {
                richTextBox1.Invoke(new MethodInvoker(delegate { richTextBox1.Text = ConstructedMsg; }));
                //Send acknowlegement to sender port
                SP.Write(SP.PortName);
                return;
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.StackTrace.ToString());
        }
    }  
A: 

You are already calling SP.Write(), that ought to be close. Although you probably don't want to send the port name back, the sender has little use for that. It also shouldn't be in the InvokeRequired test. Which is always true btw, you might as well remove that.

You also really want to get rid of the Sleep() call. Use ReadLine() if the sender terminates its message with a line feed ("\n"). If you are contemplating this because you need the sender to stop sending until it gets the acknowledgment then the real problem is in you using Sleep and ReadExisting.

Hans Passant