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;
}
}
}
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
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);
}
}
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