Προς το περιεχόμενο

Πρόβλημα με το άνοιγμα της θύρας για GPS.


ilias_gr

Προτεινόμενες αναρτήσεις

Δημοσ.

Δεν ξέρω αν σε αυτό το φόρουμ υπάρχουν ειδικοί για να απαντήσουν στο πρόβλημά μου, αλλά δε χάνω τίποτα να ρωτήσω.

 

Θέλω να φτιάξω ένα προγραμματάκι που να τρέχει σε συσκευή GPS (PNA) με Windows CE.

 

Αυτό το πρόγραμμα θα λαμβάνει τις πληροφορίες NMEA από τον δέκτη GPS και θα εμφανίζει το Latitude και το Longitude.

 

Εγκατέστησα το Visual Studio 2008 και έφτιαξα ένα απλό προγραμματάκι με την Visual Basic.

Το κάνω κανονικά deploy σε μία συσκευή MLS Destinator και το τρέχω.

Ξεκινάει κανονικά η εφαρμογή και μόλις πάει να ανοίξει την θύρα του GPS, μου βγάζει σφάλμα "System.IO.IOException" στην εντολή SerialPort.Open().

 

Το ίδιο το αρχείο exe, το κάνω Copy (μέσω της κάρτας SD) σε μία άλλη συσκευή που έχω (Navigon 2100max) και δουλεύει κανονικά!

Ανοίγει την θύρα και δείχνει τα δεδομένα του GPS!!

Δεν γίνεται, όμως, να χρησιμοποιήσω αυτή τη συσκευή για δημιουργία εφαρμογών γιατί δεν υποστηρίζεται από το ActiveSync,

οπότε δεν μπορώ να κάνω deploy απ' ευθείας στο Navigon. Θα πρέπει να κάνω deploy στην άλλη συσκευή και μετά να αντιγράφω το exe

και αυτό είναι πολύ χρονοβόρο.

 

Στην συσκευή MLS Destinator έχω αρκετά προγραμματάκια (όπως το NoniGPS Plot) που την ανοίγουν κανονικά τη θύρα του GPS. Πως γίνεται;

Έχω δοκιμάσει τη Visual Basic 2008 και 2005 και την Visual C# 2008 και 2005, αλλά τίποτα.

Στο Navigon δουλεύει κανονικά, αλλά στο MLS Destinator δεν δουλεύει με τίποτα.

 

Και οι δύο συσκευές έχουν Windows CE 5.0

Το Navigon έχει .NET CF 3.5 ενώ το MLS έχει .NET CF 2.0 (δεν γίνεται εγκατάσταση το 3.5)

 

 

Έχει κανένας από σας MLS Destinator να μου πει αν αντιμετοπίζει το ίδιο πρόβλημα;

Καμιά ιδέα πως να το κάνω να δουλέψει το SerialPort.Open();

 

Αν θέλετε μπορώ να σας δώσω τον κώδικα.

 

 

Ευχαριστώ για τον χρόνο σας.

Δημοσ.

Μήπως δοκιμάζεις λάθος θύρα; Εξ' ορισμού, στα Windows CE .NET η COM1 δεσμεύεται για debugging και δεν είναι διαθέσιμη σε application level.

 

Στο Navigon πιθανώς να είναι απενεργοποιημένη αυτή η δυνατότητα, με βάση αυτά, η περνώντας στον bootloader την παράμετρο /C:0

Δημοσ.

Δεν έχω ασχοληθεί με Windows CE 5.0, αν όμως έχεις διάθεση δες το GPS Sample που έρχεται παρέα με το SDK των Windows Mobile 6 (και 5 –αν και η MS προτείνει την χρήση του WM6 GPS Sample ακόμα και για εφαρμογές που προορίζονται για WM5 καθώς είναι βελτιωμένο) το οποίο παρέχει ένα ολοκληρωμένο .NET Assembly για την διαχείριση του GPS μέσο του GPS Intermediate Driver που προσφέρουν τα Windows Mobile/CE σε Managed Code μορφή.

 

Λογικά δεν θα χρειασθείς τίποτε περισσότερο από αυτό τουλάχιστον σε WM 5/6 εφόσον γράφεις σε Compact Framework .NET και ακολουθήσεις τις οδηγίες:

 

http://msdn.microsoft.com/en-us/library/bb158708.aspx

 

Καλή τύχη!

 

Υ.Γ.

Ελπίζω να μην έχω μπλέξει τα Version των CE και να παίζει αυτό το assembly σε WinCE 5 διότι η MS κάθε φορά αλλάζει την ονομασία τους :P

Δημοσ.

Μόλις δοκίμασα το GPS Intermediate Driver αλλά δυστυχώς δεν δουλεύει σε Windows CE.

Είναι μόνο για Windows Mobile.

 

Πάντως, σ' ευχαριστώ για τον χρόνο σου.

Δημοσ.

Επιτέλους, τα κατάφερα! :-D

 

Το OpenNETCF.IO.Serial δουλεύει άψογα! icon14.gif

 

Σας αναφέρω την λύση για όποιον ενδιαφέρεται:

 

 

Κατεβάστε το OpenNETCF.IO.Serial.zip από εδώ: http://serial.codeplex.com/Release/ProjectReleases.aspx

Ξεκινήστε ένα νέο Project με VC# ή VB.

Δώστε στην φόρμα τις διαστάσεις της συσκευής σας (πχ 240x320 ή 480x272).

Αποθηκεύστε το!

Αποσυμπιέστε το OpenNETCF.IO.Serial.zip στον φάκελο που κάνατε save το project σας.

Από το μενού File επιλέξτε Add -> Existing Project...

Πηγαίνετε στον φάκελο του project σας και κάντε διπλό κλικ στο αρχείο OpenNETCF.IO.Serial.csproj.

Θα σας βγάλει ένα μήνυμα (δεν ξέρω γιατί) επιλέξτε Yes.

Από δεξιά (Solution Explorer) κάντε δεξί κλικ στο OpenNETCF.IO.Serial και επιλέξτε Build (Μη τρομάξετε με τα Warnings).

Τώρα κάντε δεξί κλικ στο Project σας (πάλι απ' το Solution Explorer) και επιλέξτε Add Reference...

Από την καρτέλα Projects κάντε διπλό κλικ στο OpenNETCF.IO.Serial.

Αυτό ήταν, είστε έτοιμοι!

 

Σας δίνω ένα παράδειγμα γραμμένο σε Visual Basic:

Βάλτε στην φόρμα 3 κουμπιά (Button1, Button2, Button3) και ένα TextBox (TextBox1).

Στα Properties του TextBox1 επιλέξτε Multiline = True και μεγαλώστε το TextBox στο ύψος (σχεδόν σε όλο το παράθυρο).

Τώρα θα πρέπει να βάλετε ένα Timer (Timer1) απ' το οποίο θα διαβάζουμε την θύρα του GPS.

Μπείτε στον κώδικα και κάντε copy/paste τα παρακάτω και είστε έτοιμοι:

 

>
Imports System.Text
Imports OpenNETCF.IO.Serial

Public Class Form1
 Dim MyPort As Port
 Dim IncomingData As String = ""

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   Me.Text = "Read GPS Sample"
   Button1.Text = "Open COM"
   Button2.Text = "Close COM"
   Button3.Text = "Exit"

   MyPort = New Port("COM7:") ' Εδώ βάλτε τη θύρα του GPS.

   MyPort.RThreshold = 1 ' get an event for every 1 byte received
   MyPort.InputLen = 1   ' calling Input will read 1 byte
   MyPort.SThreshold = 1 ' send 1 byte at a time

   Timer1.Enabled = True
 End Sub

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
   Try
     TextBox1.Text = TextBox1.Text + vbCrLf + "Opening COM Port... "
     MyPort.Open()
     TextBox1.Text = TextBox1.Text + "OK!" + vbCrLf
   Catch ex As Exception
     TextBox1.Text = TextBox1.Text + vbCrLf + ex.Message + vbCrLf
   End Try

   If MyPort.IsOpen() Then TextBox1.Text = TextBox1.Text + vbCrLf + "COM Port is open!" + vbCrLf
 End Sub

 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
   Try
     TextBox1.Text = TextBox1.Text + vbCrLf + "Closing COM Port... "
     MyPort.Close()
     TextBox1.Text = TextBox1.Text + "OK!" + vbCrLf
   Catch ex As Exception
     TextBox1.Text = TextBox1.Text + vbCrLf + ex.Message + vbCrLf
   End Try

   If Not MyPort.IsOpen() Then TextBox1.Text = TextBox1.Text + vbCrLf + "COM Port is closed!" + vbCrLf
 End Sub

 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
   If MyPort.IsOpen() Then MyPort.Close()
   MyPort.Dispose()
   Application.Exit()
 End Sub

 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
   If Not MyPort.IsOpen() Then Exit Sub

   Dim enc As Encoding = Encoding.ASCII 'Display as text
   Dim inputData As Byte() = New Byte(0) {}
   Dim I As Integer

   For I = 1 To MyPort.InBufferCount
     inputData = MyPort.Input 'Read the character
     IncomingData = IncomingData + enc.GetString(inputData, 0, inputData.Length)
   Next I
   If IncomingData <> "" Then
     Try
       TextBox1.Text = TextBox1.Text + IncomingData
       IncomingData = String.Empty
     Catch ex As Exception
       TextBox1.Text = TextBox1.Text + vbCrLf + ex.Message + vbCrLf
     End Try
   End If
   TextBox1.SelectionStart = TextBox1.Text.Length : TextBox1.ScrollToCaret() 'Scroll TextBox Down
 End Sub
End Class

 

Αν τα κάνατε όλα σωστά, θα έχετε το παρακάτω αποτέλεσμα:

readgpssample.gif

 

Τώρα, αν κάποιος θέλει να το κάνει με Visual C#, μπορεί να

κατεβάσει το SerialCSharp.zip από εδώ: http://serial.codeplex.com/Release/ProjectReleases.aspx

 

 

Ευχαριστώ για τον χρόνο σας, το πρόβλημά μου λύθηκε!

  • 8 μήνες μετά...
Δημοσ.

Όμως ενώ δημιουργώ το πρόγραμμα ΑΚΡΙΒΩΣ όπως λέτε στο παράδειγμα και παίρνω και απάντηση ότι η port είναι κανονικα ανοικτή, τα data είναι πολυ διαφορετικα και δεν έχουν καμμία σχέση με μορφή δεδομένων NMEA.......

 

ΠΟΥ μπορεί να υπάρχει σφάλμα ;;;

 

Χρησιμοποιώ ένα Glofiish X600.....

  • 2 εβδομάδες αργότερα...
Δημοσ.

Χρησιμοποίησε την ταχύτητα στα 57600 και είναι οκ,

εγώ όμως αντιμετώπίζω ένα άλλο πρόβλημα, όταν κλείνω την εφαρμογή το process δεν λέει να τερματιστεί,και όταν προσπαθώ να το τερματίσω Manual δεν κλείνει οπότε αναγκάζομαι να κάνω Reset την συσκευή μήπως ξέρει κάτι κάποιος για αυτό ?

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...