User Passwort
 Passwort speichern Passwort vergessen?
 
 
 
 Alle Foren
 PDA-Dev :: Windows Mobile
 C#
 Com-Port auslesen blockiert Programm
Autor Vorheriges Thema Thema Nächstes Thema  

Martin

PDA-Interessierter


4 Beiträge

Erstellt am: 05.01.2009 :  20:41:30 Uhr  Profil anzeigen  Autor eine Email senden  Antwort mit Zitat
Hallo Forumgemeinschaft,
ich arbeite momentan an einer GPS Anwendung für Windows Mobile 6 Handys und bin dabei auf ein kleines Problem gestoßen.
Ich rufe die Daten meines GPS Senders ganz normal, wie auch im MSDN beschrieben, über den COM-Port ab und kann diese in die Console ausgeben. Wenn ich das allerdings tue, kann ich in diesem Programm gar nichts mehr machen.
Woran könnte das liegen ? Ich habe mir die Abfrage aus dem MSDN gezogen da ich auf dem Gebiet eher Planlos bin ;/
Hier mal der Code:
 
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.IO.Ports;
using System.Threading;
using System.Windows.Forms;
namespace SmartDeviceProject3
{
public partial class gps2bla : Form
{
static SerialPort _serialPort;
static bool _continue = true;
public gps2bla()
{
InitializeComponent();
}
private void button1_Click_1(object sender, EventArgs e)
{
InitializeComport();
}
public void InitializeComport() // Quelle: MSDN
{
string name;
string message;
StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
Thread readThread = new Thread(Read);
// Create a new SerialPort object with default settings.
_serialPort = new SerialPort();
// Allow the user to set the appropriate properties.
_serialPort.PortName = "COM1";
_serialPort.BaudRate = 38400;
_serialPort.Parity = Parity.None;
_serialPort.DataBits = 8;
_serialPort.StopBits = StopBits.One;
_serialPort.Handshake = Handshake.None;
// Set the read/write timeouts
_serialPort.ReadTimeout = 500;
_serialPort.WriteTimeout = 500;
_serialPort.Open();
_continue = true;
readThread.Start();
Console.Write("Name: ");
name = Console.ReadLine();
Console.WriteLine("Type QUIT to exit");
while (_continue)
{
message = Console.ReadLine();
if (stringComparer.Equals("quit", message))
{
_continue = false;
}
else
{
_serialPort.WriteLine(
String.Format("<{0}>: {1}", name, message));
}
}
readThread.Join();
_serialPort.Close();
}
public void Read() // Bis auf boxchange aufruf wie MSDN Beispiel
{
while (_continue)
{
try
{
string message = _serialPort.ReadLine();
//Console.WriteLine(message);
boxchange(message);
}
catch (TimeoutException ex)
{
//Console.WriteLine("TimeoutException", ex.Message);
}
}
}
public void boxchange(object message) // Beispielmethode, hier sollen später die GPS Daten in Geschwindigkeit, Strecke usw. umgerechnet werden
{
Console.WriteLine(message);
if (this.InvokeRequired)
{
this.textBox1.BeginInvoke(new WaitCallback(boxchange), message);
return;
}
else
{
this.textBox1.Text = (string)message;
}
}
 
Ich wäre euch dankbar wenn mir jemand sagen könnte was ich falsch mache.
Ich bin nicht umbedingt an die Art des abfragen der Ports gebunden, falls also jemand ein anderes Beispiel liefert, bin ich dafür offen. Wichtig ist mir nur, dass ich aus den abgefragten GPS Daten später Geschwindigkeit, zurückgelegte Entfernung, Zeit und natürlich die Position selbst berechnen kann.
Über das "wie", habe ich mir noch nicht so die gedanken gemacht aber eins nach dem anderen

Bearbeitet von: Martin am: 05.01.2009 21:11:14 Uhr
   

Useless user

PDA-Spezialist


465 Beiträge

Erstellt  am: 05.01.2009 :  21:18:25 Uhr  Profil anzeigen  Besuche Useless user's Homepage  Antwort mit Zitat
Also das ist richtig das wenn du aus deinem Thread auf ein Control zugreifen willst die Invoke oder BeginInvoke-Methode verwenden musst, ich würde es aber etwas umbauen:
public void Read()
{
while (_continue)
{
try
{
string message = _serialPort.ReadLine();
//Console.WriteLine(message);
this.textBox1.BeginInvoke(new BoxChangeDgt(boxchange), message);
}
catch (TimeoutException ex)
{
//Console.WriteLine("TimeoutException", ex.Message);
}
}
}
private void boxchange(object message)
{
this.textBox1.Text = (string)message;
}
 
Also immer wenn ich den invoke auf den Oberflächenthread gemacht hab, hab ich eine eigene Delegatenklasse (in diesem Fall BoxChangeDgt) verwendet statt "WaitCallback" - vlt. liegt es ja daran. Evtl. kannst du auch einfach eine generische Delegatenklasse instanzieren (Action Of String oder so).
In der Nicht-Test-Version solltest du unbedingt verhindern, dass der Thread mehrfach gestartet wird (siehe Button-Click)!
Zum Anfang der Seite

Martin

PDA-Interessierter


4 Beiträge

Erstellt  am: 05.01.2009 :  21:23:21 Uhr  Profil anzeigen  Autor eine Email senden  Antwort mit Zitat
Hallo Useless user,
ich konnte das Problem kurz nach dem Posten hier besser einschränken und habe den Text darauf hin umgeschrieben.
Scheinbar bezieht sich deine Antwort noch auf meine ursprüngliche Frage.
Ob meine Art zu Invoken richtig ist kann ich momentan noch nicht sagen, ggf werd ich dann dein Beispiel nutzen, aber momentan muss ich erstmal versuchen rauszufinden wie ich meine Serielle abfrage in den Hintergrund bekomme so das auch noch was anderes geht, denn diese blockiert alles.
Zum Anfang der Seite

Useless user

PDA-Spezialist


465 Beiträge

Erstellt  am: 05.01.2009 :  23:30:33 Uhr  Profil anzeigen  Besuche Useless user's Homepage  Antwort mit Zitat
Type Quit to Exit? Wie soll denn das bitteschön gehen? Das ist Code aus einer Konsolenanwendung, wenn du ein Formular hast, darfst du natürlich diese Zeilen nicht verwenden, weil sie eine Schleife darstellen die in diesem Fall endlos läuft (Und das ist in deinem Fall sogar unabhängig vom Thread):
Console.Write("Name: ");
name = Console.ReadLine();
Console.WriteLine("Type QUIT to exit");
while (_continue)
{
message = Console.ReadLine();
if (stringComparer.Equals("quit", message))
{
_continue = false;
}
else
{
_serialPort.WriteLine(
String.Format("<{0}>: {1}", name, message));
}
}
readThread.Join();
_serialPort.Close();
Zum Anfang der Seite

Martin

PDA-Interessierter


4 Beiträge

Erstellt  am: 06.01.2009 :  04:07:59 Uhr  Profil anzeigen  Autor eine Email senden  Antwort mit Zitat
vielen dank Useless user, mit dieser Antwort hast du gerade ein riesiges Problem von mir gelöst.
Eigentlich hätte ich das auch sehen können. Das hat man davon, wenn man einfach nur Copy&Paste ausm MSDN macht ohne genau hinzuschauen.
Zum Anfang der Seite

Martin

PDA-Interessierter


4 Beiträge

Erstellt  am: 06.01.2009 :  14:55:32 Uhr  Profil anzeigen  Autor eine Email senden  Antwort mit Zitat
Meine Abfrage Methode sieht nun übrigens so aus und funktioniert wunderbar:
 
public void InitializeComport()
{
StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
Thread readThread = new Thread(Read);
_serialPort = new SerialPort();
_serialPort.PortName = "COM1";
_serialPort.BaudRate = 38400;
_serialPort.Parity = Parity.None;
_serialPort.DataBits = 8;
_serialPort.StopBits = StopBits.One;
_serialPort.Handshake = Handshake.None;
_serialPort.ReadTimeout = 500;
_serialPort.WriteTimeout = 500;
_serialPort.Open();
_continue = true;
readThread.Start();
}
 

Bearbeitet von: Martin am: 06.01.2009 14:59:16 Uhr
Zum Anfang der Seite
  Vorheriges Thema Thema Nächstes Thema  
Springe nach:
 
  Bookmark & Share  
 
 
 
  Tags  
   
 

 



pda-dev.de

Quicklinks: Foren-Übersicht | Developer-News | Suche | Impressum

© just-works! Software

Zum Anfang der Seite

Snitz Forums 2000