Laden...

Listbox wird nur beim debuggen gefüllt

Erstellt von MaWo80 vor 15 Jahren Letzter Beitrag vor 13 Jahren 1.723 Views
MaWo80 Themenstarter:in
106 Beiträge seit 2006
vor 15 Jahren
Listbox wird nur beim debuggen gefüllt

Hi,

habe eine kleine Anwendung geschrieben, bei der über die Serielle Schnittstelle von einem Funkmodem Daten reinkommen. Diese Daten sollen in eine Listbox geschrieben werden. Wenn ich debugge dann funktioniert alles einwandfrei, wenn ich nur compiliere oder nur die exe starte dann nicht. weiß jemand einen Rat ??


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
using System.Globalization;
using System.Threading;


namespace TETRA_SDS_neu
{
    public partial class Form1 : Form
    {        
        public Form1()
        {            
            InitializeComponent();

            serialPort1.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived);

            serialPort1.Open();

            SendATCommand("AT+CTSP=1,3,,130", true, false );
            //SendATCommand("AT+CMGS=1,72", true, false);
            //SendATCommand("8204FF0148656C6C6F", false, true);            
        }
        
        private void SendATCommand(string command, bool crlf, bool ctrlz)
        {
            string senddata = "";
            if ( crlf )
                senddata = command + Convert.ToChar(13) + Convert.ToChar(10);
            if (ctrlz)
                senddata = command + Convert.ToChar(26);
            serialPort1.WriteLine( senddata );            
        }

        private string HexToString(string hex)
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i <= sb.Length; i++)
            {
                sb.Append(Convert.ToString(Convert.ToChar(Int32.Parse(hex.Substring(i, 2), System.Globalization.NumberStyles.HexNumber))));
            }
            return sb.ToString();
        }

        private void btnSenden_Click(object sender, EventArgs e)
        {
            string s = txtAusgang.Text;
            StringBuilder hex = new StringBuilder(s.Length * 2);
            foreach (char c in s)
                hex.Append(Convert.ToString(c, 16));            

            txtboxfuellen( hex.ToString() );
            txtAusgang.Clear(); // Text in TextBox nach senden wieder löschen
            string senddata = "8204FF01" + hex.ToString();
            senddata = senddata.ToUpper();
            int sendbits = senddata.Length * 4;
            SendATCommand("AT+CMGS=" + txtAdresse.Text + "," + sendbits, true, false);
            SendATCommand( senddata, false, true);
        }

        delegate void MessageDataDelegate(string data);

        private void SerialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {

            MessageDataDelegate dlgte = new MessageDataDelegate(MessageData);          
            string recvData = serialPort1.ReadExisting();
            this.BeginInvoke(dlgte, new object[] { recvData });                        
        }

        private void MessageData(string data)
        {
            //a = a.Replace("\r\n", " ");
            data = data.Replace("\r\n", " ");
            string Nutzdaten = "";
            int Nutzdatenstart = 0;
            Nutzdatenstart = data.IndexOf("8204");// gibt den Start von 8204 zurück
            if (Nutzdatenstart > 1)
            {
                Nutzdaten = data.Substring(Nutzdatenstart + 8);
                Nutzdaten = this.ConvertHexToAscii(Nutzdaten);
                lbxEingang.Items.Insert(0, Nutzdaten);
            }
        }
        
        public String ConvertHexToAscii(String Nutzdaten)
        {
            byte[] bArray = new byte[Nutzdaten.Length / 2];

            // B-Array füllen.
            for (int i = 0; i < bArray.Length; i++)
            {
                // Jeweils zwei Zeichen als Byte parsen.
                String bString = Nutzdaten.Substring(2 * i, 2);
                byte b = Byte.Parse(bString, NumberStyles.HexNumber);
                // Geparstes Byte ablegen.
                bArray[i] = b;
            }
            //Umwandlung in Ascii String
            Encoding enc = Encoding.GetEncoding(850);
            String asciiString = enc.GetString(bArray);
            return asciiString;
            //MessageBox.Show(asciiString);
        } 

        public void txtboxfuellen (string hex1)
        {
           hex1 = string.Format("{0:HH:mm:ss}", new DateTime()) + " " + hex1; // Uhrzeit einfügen
            string textalt;
            textalt = txtboxtest.Text;            
            txtboxtest.Text = "";           
            txtboxtest.AppendText(hex1 + Environment.NewLine + textalt);                       
        }
        

        private void button1_Click(object sender, EventArgs e) // Dioalog Datei einlesen
        {
            string Pfad = string.Empty;
            OpenFileDialog openFileDialog1 = new OpenFileDialog();  // Dialog Datei einlesen
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                txtAusgang.Text = ReadStatusFile(openFileDialog1.FileName);
            }
        }

        public string ReadStatusFile(string sFilename)
        {
            string sContent = "";
            if (File.Exists(sFilename))
            {
                StreamReader myFile = new StreamReader(sFilename, System.Text.Encoding.Default);
                sContent = myFile.ReadToEnd();
                myFile.Close();
            }
            return sContent;
        }


        public string AdresseFormatieren(string input)
        {
            int length = input.Length;      // Liest Länge der Adresse
            int dif = 8 - length;           // Ermitteln der fehlenden Nullstellen
            string nullen = "";             // Adresse ohne führenden Nullstellen schreiben
            if (dif > 0)
            {
                for (int a = 0; a < dif - 1; a++)
                {
                    nullen = "0" + nullen;
                }
            }
            return nullen + input;
        }             
    }
}


3.430 Beiträge seit 2007
vor 15 Jahren

Hallo MaWo80,

so ist es sehr schwer zu sagen, was dein Problem sein könnte, denn dazu ist dieses Programm einfach zu komplex und die Angaben sind zu ungenau.

In so einem Fall erstelle ich meistens eine ganz simple Logdatei, in der ich den Inhalt der wichtigsten Variablen und weitere relevante Dinge schreibe.
Damit kann man dann relativ leicht feststellen wo dein Programm nicht mehr weiter geht, oder was der Grund für das Problem ist.

Wenn du mehr Details lieferst, dann könnte dir bestimmt jemand weiterhelfen.

Gruss
Michael

MaWo80 Themenstarter:in
106 Beiträge seit 2006
vor 15 Jahren

Hallo mihclG
Ich denke das das hier nur von Intresse dafür ist. Wenn ich einen breakpoint an die Data Recieve Funktion der Schnittstelle lege, und dann step für step weiter debugge , dann wird der Wert in die Listbox geliefert. Setze ich keinen Breakpoint, dann wird nichts in die Listbox geschrieben. Hoffe du kannst jetzt mehr damit anfangen!! Gruß Maddin


 private void SerialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {

            MessageDataDelegate dlgte = new MessageDataDelegate(MessageData);
            string recvData = serialPort1.ReadExisting();
            this.BeginInvoke(dlgte, new object[] { recvData });
        }

        private void MessageData(string data)
        {
            //a = a.Replace("\r\n", " ");
            data = data.Replace("\r\n", " ");
            string Nutzdaten = "";
            int Nutzdatenstart = 0;
            Nutzdatenstart = data.IndexOf("8204");// gibt den Start von 8204 zurück
            if (Nutzdatenstart > 1)
            {
                Nutzdaten = data.Substring(Nutzdatenstart + 8);
                Nutzdaten = this.ConvertHexToAscii(Nutzdaten);
                lbxEingang.Items.Insert(0, Nutzdaten);
            }
        }

D
115 Beiträge seit 2006
vor 13 Jahren

Bei der Suche nach einem ähnlichen Problem habe ich dieses Thema als einziges gefunden, daher wollte ich mal eben noch ne Lösungsmöglichkeit ergänzen :

Vor dem Öffnen sollte serialPort1.ReceivedBytesThreshold auf einen höheren Wert gesetzt werden, weil sonst nach jeweils 1 empfangegen Zeichen das Event ausgelöst wird.
In diesem Beispiel wird dann nach einer Zeichenkette gesucht, die so komplett nicht in den Empfangsdaten stehen kann.

Mit einem Breakpoint funktioniert das, weil sich der Empfangspuffer füllt, bis man Schritt für Schritt da durch geht. Dann empfängt man ganze Zeichenketten und die Funktion arbeitet wieder.

Gruß Dominik