Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 302
  • Last Modified:

Serial Ports and Threading

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
jmkotman
Asked:
jmkotman
1 Solution
 
so3Commented:
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
 
DimkovCommented:
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
 
gnoonCommented:
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
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
jmkotmanAuthor Commented:
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
 
so3Commented:
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
 
gnoonCommented:
>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

[Webinar On Demand] Database Backup and Recovery

Does your company store data on premises, off site, in the cloud, or a combination of these? If you answered “yes”, you need a data backup recovery plan that fits each and every platform. Watch now as as Percona teaches us how to build agile data backup recovery plan.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now