Problem z odczytem długości stringa po RS232

0

Witam, mam problem jak w temacie a dokładniej W polu richtextbox zawsze otrzymuje co 1 sek 18 znakowy string i zawsze pisze bezpłędnie ten napis, natomiast gdy chce do label12 wczytać jego długość wychodzą krzaki raz 18 raz 10 raz 4 itd. Co może być nie tam. I czasem zauważyłem że jak dłużej pochodzi program to nie mogę zamknąć portu. Poniżej kod:

 
 private void butCon_Click(object sender, EventArgs e)
        {
            try
            {
                  serialPort1.Open();
                   if (serialPort1.IsOpen)
                   {
                butCon.Enabled = false;
                butDecon.Enabled = true;
                kontrolka.FillColor = System.Drawing.Color.Green;
                comboBox1.Enabled = false;
                comboBox2.Enabled = false;
                comboBox3.Enabled = false;
                comboBox4.Enabled = false;
                comboBox5.Enabled = false;
    
                 }
            }
            catch (Exception exc)
            {
                MessageBox.Show("Błąd połączenia:\n" + exc.Message);
            } 
        }


        private void butDecon_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
                butCon.Enabled = true;
                butDecon.Enabled = false;
                kontrolka.FillColor = System.Drawing.Color.Red;
                comboBox1.Enabled = true;
                comboBox2.Enabled = true;
                comboBox3.Enabled = true;
                comboBox4.Enabled = true;
                comboBox5.Enabled = true;
                timer1.Enabled = false;
            }
            this.Refresh();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //*-- WCZYTANIE DOSTĘPNEJ LISTY PORTÓW COM DO COMBOBOXA **--/                                          


            string[] port = System.IO.Ports.SerialPort.GetPortNames();
            foreach (string item in port)
            {
                comboBox1.Items.Add(item);
            }
            if (comboBox1.Items.Count == 0)
            {
                MessageBox.Show("Nie wykryto żadnego portu COM");
            }
            else
            {
                comboBox1.Text = port[0]; //pierwszym elementem wyswietlanym w comboboxie będzie pierwszy port
            }
         //   this.comboBox1.Text = serialPort1.PortName;
            this.comboBox2.Text = serialPort1.BaudRate.ToString();
            this.comboBox3.Text = serialPort1.Parity.ToString();
            this.comboBox4.Text = serialPort1.DataBits.ToString();
            this.comboBox5.Text = serialPort1.StopBits.ToString();

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serialPort1.IsOpen) serialPort1.Close();
        }

        private void DisplayText(object sender, EventArgs e)
        {
            richTextBox1.AppendText(RxString);
            label12.Text = RxString.Length.ToString();
            }

       

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
       
                RxString = serialPort1.ReadExisting(); // przekazanie odebranego łańcucha do zmiennej rx_str
                 
            this.Invoke(new EventHandler(DisplayText)); //instalacja zdarzenia parsującego odebrany łańcuch
           // }
          
        }
0

label12.Text = RxString.Trim().Length.ToString(); ?

0

Niestety dalej to samo :(

0

Spróbuj zamiast serialPort1.ReadExisting() wywołać serialPort1.ReadLine();

0

Zastosuj zwykły read z konwersją z odpowiednim kodowaniem (interesują Cię znaki jedno bajtowe)

 
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{ 
     byte[] UartBuffTemp = new byte[2048];
     serialPort1.Read(UartBuffTemp, 0, 2048);
     RxString = ASCIIEncoding.GetEncoding(28591).GetString(UartBuffTemp);
 
     this.Invoke(new EventHandler(DisplayText)); //instalacja zdarzenia parsującego odebrany łańcuch
}
0
bfraszczyk napisał(a):

Spróbuj zamiast serialPort1.ReadExisting() wywołać serialPort1.ReadLine();

Ta metota nic nie wyświetla i wyrzyca wyjątek TimeOutException

0
kult napisał(a):

Zastosuj zwykły read z konwersją z odpowiednim kodowaniem (interesują Cię znaki jedno bajtowe)

 
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{ 
     byte[] UartBuffTemp = new byte[2048];
     serialPort1.Read(UartBuffTemp, 0, 2048);
     RxString = ASCIIEncoding.GetEncoding(28591).GetString(UartBuffTemp);
 
     this.Invoke(new EventHandler(DisplayText)); //instalacja zdarzenia parsującego odebrany łańcuch
}

W tej metodzie zawsze mam długość stringa mam 2048 a jak chce zamknąć port to program się zawiesza. Odwieszanie polega jak wcisnę prawy klawisz myszy na pasku startu aktywny formularz

0

Już działa Wersja z ReadLine(). Miałem ustawione ReadTime na 300. Zmieniłem na domyślne (-1) i length zawsze 18, tylko zauważyłem że gdy chcę zamknąć port w momencie przychodzenia danych to program się zasina (to co pisałem wyżej).

1 użytkowników online, w tym zalogowanych: 0, gości: 1