Solved

Serial Ports and Threading

Posted on 2007-12-06
6
288 Views
Last Modified: 2013-12-03
I am writing a code that will output a set of bit array through the com port and too hyperterminal on another computer.  I need to have this transfer till i press stop button on my GUI interface.  I know we need to use threading to do this task.  The code below outputs the bits to hyperterminal once.  I would like to know how to make it a constant loop till i press stop.  Suggestions would be wonderful.

 public void TransmitData()
        {
            byte[] bytearray = new byte[512];
            try
            {
                SerialPort port = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One);
                port.Open();
                for (int i = 0; i < 512; i++)
                {
                    bytearray[i] = (byte)array[i];
                }
                port.Write(bytearray, 0, 512);
                port.Close();
            }
            catch
            {
                MessageBox.Show("Please Connect Serial Cable");
            }
        }
0
Comment
Question by:jmkotman
6 Comments
 
LVL 6

Expert Comment

by:so3
ID: 20426071
Put 2 buttons on the form.
  private void button1_Click(object sender, EventArgs e)

        {

            TransmitData();

        }
 

        bool working = true;

        public void TransmitData()

        {

            byte[] bytearray = new byte[512];

            try

            {

                working=true;

                SerialPort port = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One);

                port.Open();
 

                while (working)

                {

                    Application.DoEvents();

                    if (!working) break;

                    port.Write("write data");

                }

                port.Close();

            }

            catch

            {

                MessageBox.Show("Please Connect Serial Cable");

            }

        }
 

        private void button2_Click(object sender, EventArgs e)

        {

            working = false;

        }

Open in new window

0
 
LVL 3

Expert Comment

by:Dimkov
ID: 20426080
make while(1) loop inside the function
Created thread which points to this function.

Then you have command like thread.start, thread.stop, that tell when the thread sholud work or stop

just an idea :)
0
 
LVL 16

Accepted Solution

by:
gnoon earned 500 total points
ID: 20426165
Just an implementation of Dimkov's idea
// a shared flag indicate that writing data should be continue

bool _continue;
 

/// <summary>

/// Keep transmit data to COM2 port until stop is pressed.

/// </summary>

public void TransmitData(byte[] data)

{

    try

    {

        using(SerialPort port = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One))

        {

            port.Open();

            while(_continue)

            {

                port.Write(data, 0, data.Length);

                try{System.Threading.Thread.Sleep(100);}catch(Exception){}

            }

        }

    }

    catch(Exception)

    {

        MessageBox.Show("Please Connect Serial Cable");

    }

}
 

public void StartTransmitInAnotherThread()

{

    // make a copy of data

    byte[] data = new byte[512];

    for(int i=0; i<data.Length && i<array.Length; i++)

        data[i] = (byte)array[i];
 

    // start new thread of transmit

    System.Threading.Thread t = new System.Threading.Thread(this.TransmitData);

    t.Name = "SerialPortThread";

    t.IsBackground = true;

    t.Start(data);

}
 

private void btnStart_Click(object sender, System.EventArgs e)

{

    // prevent click start twice

    btnStart.Enabled = false;

    btnStop.Enabled = true;
 

    // set flag to keep writing data

    _continue = true;
 

    // start transmit

    StartTransmitInAnotherThread();

}
 

private void btnStop_Click(object sender, System.EventArgs e)

{

    btnStart.Enabled = true;

    btnStop.Enabled = false;
 

    // set flag to stop writing data

    _continue = false;

}

Open in new window

0
Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

 

Author Comment

by:jmkotman
ID: 20428813
I just implamented So3's code and it worked, but does that have anything to do with threading?  I am implamenting gnoon's code and i am receiving the compile error The best overloaded method match for 'System.threading.thread.thread(System.threading.threadstart)' has some invalid arguments.  This error is refering to: System.Threading.Thread t = new System.Threading.Thread(this.TransmitData);

Thanks for your help
0
 
LVL 6

Expert Comment

by:so3
ID: 20429363
No, my code is not with threading because i don't think that you need it. From what i understood you need to use only one function (with start and stop function). For what you need it will not take the processor so you can use it without threading(and also is a easy solution)
0
 
LVL 16

Expert Comment

by:gnoon
ID: 20433051
>i am receiving the compile error The best overloaded method match for 'System.threading.thread.thread(System.threading.threadstart)' has some invalid arguments
Sorry for that. I did not test it in VS before post.

Compile error because TransmitData does not matched with signature function needed by ParameterizedThreadStart class. It requires a function having a parameter of type Object.

Change the code of TransmitData to this, you will get it compiled

public void TransmitData(object param)
{
    byte[] data = (byte[]) param;
    try
    {
        ....
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Entity Framework is a powerful tool to help you interact with the DataBase but still doesn't help much when we have a Stored Procedure that returns more than one resultset. The solution takes some of out-of-the-box thinking; read on!
Calculating holidays and working days is a function that is often needed yet it is not one found within the Framework. This article presents one approach to building a working-day calculator for use in .NET.
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

23 Experts available now in Live!

Get 1:1 Help Now