Click here to Skip to main content
15,889,848 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
The motto for the project is to extablish a test setup to check data send & receive with different serial port settings such as baud rate, data bits, parity etc. When the serial port baud rate is changed and executed, the above error occurs during reading/writing data. Some times the error occurs when accessing serial port properties.
Sample application is created with 2 serial port objects, assume com1 & com7. Data is sent from Com1 to Com7. I have a thread that recieves the data in com7 and sends it back to Com1. Using another thread, data from com1 is read and write to file. Code is attached below.
C#
private void Form2_Load(object sender, EventArgs e)
{
  sp.BaudRate = 9600;
  sp.DataBits = 8;
  sp.StopBits = StopBits.One;
  sp.Handshake = Handshake.None;
  sp.Parity = Parity.None;
  sp.PortName = "COM7";
  sp.Open();
  sp1.BaudRate = 9600;
  sp1.DataBits = 8;
  sp1.StopBits = StopBits.One;
  sp1.Handshake = Handshake.None;
  sp1.Parity = Parity.None;
  sp1.PortName = "COM1";
  sp1.Open();

  rxThread = new Thread(new ThreadStart(ReceiveBytes));
  rxThread.SetApartmentState(ApartmentState.STA);
  rxThread.Name = "Serial Receive Message Thread";
  rxThread.Start();
  rxThread1 = new Thread(new ThreadStart(ReceiveBytes1));
  rxThread1.SetApartmentState(ApartmentState.STA);
  rxThread1.Name = "Serial Receive Message Thread";
  rxThread1.Start();
  _SyncObj = new object();
}
private void ReceiveBytes1()
{
  try
  {
    sw1 = new StreamWriter("C:\\sample1.txt", true);
    while (true)
    {
      if (bAbort)
        break;
      if (sp != null)
      {
        while (sp.IsOpen && sp.BytesToRead > 0 && sp.BreakState == false)
        {
          if (sp.IsOpen)
          {
            String res = sp.ReadExisting();
            sb.Append(res);
            //sw1.Write(res);
          }
        }
      }
    }
  }
  catch (Exception ex)
  {
    string r = ex.Message;
  }
}
private void ReceiveBytes()
{
  try
  {
    while (true)
    {
      if (bAbort)
        break;
      if (sp1 != null)
      {
        while (sp1.IsOpen && sp1.BytesToRead > 0 && sp1.BreakState == false) // Read Bytes, if available from port
        {
          if (sp1.IsOpen)
          {
            //string res = sp1.ReadExisting();
            //lock (_SyncObj)
            //{
            int res = sp1.ReadByte();
            if (sp1.BreakState == false)
              sp1.Write(new Byte[] { (Byte)res }, 0, 1);
            //}
          }
        }
      }
    }
  }
  catch (Exception ex)
  {
    string r = ex.Message;
  }
}
public void ClearSerialPort()
{
  try
  {
    sp.BreakState = true;
    Thread.Sleep(2400);
    while (sp.BytesToRead > 0)
      sp.DiscardInBuffer();
    while (sp.BytesToWrite > 0)
      sp.DiscardOutBuffer();
  }
  catch (Exception e)
  {
    string err = e.Message;
  }
}
public void ClearSerialPort1()
{
  try
  {
    sp1.BreakState = true;
    Thread.Sleep(2400);
    while (sp1.BytesToRead > 0)
      sp1.DiscardInBuffer();
    while (sp1.BytesToWrite > 0)
      sp1.DiscardOutBuffer();
  }
  catch (Exception e)
  {
    string err = e.Message;
  }
}
private void button1_Click(object sender, EventArgs e)
{
  for (int i = 1; i < 6; i++)
  {
    // Attempt 1
    String hexData = GetHexStringFromFile("C:\\Documents and Settings\\ravikr0\\Desktop\\test\\testfiles_1019\\test_1Kb.txt");
    Char[] data = GetCharArrayfromString(hexData);
    SendData(data);
    ClearSerialPort();
    ClearSerialPort1();
    sp1.BaudRate = 1200;
    sp.BaudRate = 1200;
    sp.BreakState = false;
    sp1.BreakState = false;
    // Attempt 2
    hexData = "12345678901234567890";
    data = GetCharArrayfromString(hexData);
    SendData(data);
    ClearSerialPort();
    ClearSerialPort1();
    sp1.BaudRate = 2400;
    sp.BaudRate = 2400;
    sp.BreakState = false;
    sp1.BreakState = false;
    // Attempt 3
    hexData = GetHexStringFromFile("C:\\Documents and Settings\\ravikr0\\Desktop\\test\\testfiles_1019\\test_1Kb.txt");
    data = GetCharArrayfromString(hexData);
    SendData(data);
    ClearSerialPort();
    ClearSerialPort1();
    sp1.BaudRate = 4800;
    sp.BaudRate = 4800;
    sp.BreakState = false;
    sp1.BreakState = false;
    // Attempt 4
    hexData = GetHexStringFromFile("C:\\Documents and Settings\\ravikr0\\Desktop\\test\\testfiles_1019\\test_1Kb.txt");
    data = GetCharArrayfromString(hexData);
    SendData(data);
    ClearSerialPort();
    ClearSerialPort1();
    sp1.BaudRate = 9600;
    sp.BaudRate = 9600;
    sp.BreakState = false;
    sp1.BreakState = false;
    // Attempt 2
    hexData = GetHexStringFromFile("C:\\Documents and Settings\\ravikr0\\Desktop\\test\\testfiles_1019\\test_1Kb.txt");
    data = GetCharArrayfromString(hexData);
    SendData(data);
  }
}
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
  bAbort = true;
  if (rxThread != null)
    rxThread.Join(1000);
  if (sw != null)
    sw.Close();
  if (rxThread1 != null)
    rxThread1.Join(1000);
  if (sw1 != null)
    sw1.Close();
}
public void SendData(Char[] data)
{
  try
  {
    sp.Write(data, 0, data.GetLength(0));
  }
  catch (Exception ex)
  {
    String err = ex.Message;
  }
}

Please provide me suggestions on how to overcome from this error.
Posted
Updated 20-Dec-11 1:40am
v3

1 solution

first of all you need to close your port then change baud rate !
C#
Char[] data = GetCharArrayfromString(hexData);
     SendData(data);
     ClearSerialPort();
     ClearSerialPort1();
////// here the code must be added
     sp1.close();
////// here the code must be added
     sp1.BaudRate = 1200;
     sp.BaudRate = 1200;
     sp.BreakState = false;
     sp1.BreakState = false;


then
C#
sp1.open()
must use again in the beginning of your transmission so please check port status using
C#
sp1.IsOpen
property for getting port status.

the other issue is due to your thread because and the serial port is attached to the thread. so you will be face problem when changing serial port property.
 
Share this answer
 
Comments
Member 13393974 4-Feb-19 4:04am    
plz give me soluation even i have same problem
Mohammad Reza Valadkhani 6-Mar-21 10:31am    
sorry for late response is your problem fixed? if need help let me know

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900