2010-11-25 32 views
2

J'essaie d'écrire une application personnalisée pour un périphérique GPS, et j'ai besoin de lire les données GPS.Windows CE et les problèmes de port série (impossible d'ouvrir le port)

Le problème que je suis face est que je ne peux pas ouvrir le port GPS. Je sais quel COM il est, et je connais le débit en bauds, mais je reçois un IOException chaque fois que j'arrive à la méthode Open().

port = new SerialPort("COM6", 9600); 
port.ErrorReceived += new SerialErrorReceivedEventHandler(port_ErrorReceived); 
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); 
try 
{ 
    port.Open(); 
} 
catch (IOException ex) 
{ 
    SetLabel(label1, ex.Message); 
} 

Trace de la pile:

at System.IO.Ports.SerialStream.WinIOError(Int32 errorCode, String str) 
at System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeout, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNull, Byte parityReplace) 
at System.IO.Ports.SerialPort.Open() 
at PortTest.Form1.button1_Click(Object sender, EventArgs e) 
at System.Windows.Forms.Control.OnClick(EventArgs e) 
at System.Windows.Forms.Button.OnClick(EventArgs e) 
at System.Windows.Forms.ButtonBase.WnProc(WM wm, Int32 wParam, Int32 lParam) 
at System.Windows.Forms.Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam) 
at Microsoft.AGL.Forms.EVL.EnterMainLoop(IntPtr hwnMain) 
at System.Windows.Forms.Application.Run(Form fm) 
at PortTest.Program.Main() 

Ce qui rend les choses tout à fait exaspérant est qu'un échantillon natif C++ codes que je trouve fonctionne, ouvre le port sans problème, et je ne pouvais même coup d'oeil à certains des Chaînes NMEA. Mais tout cela a été fait en utilisant des exemples de codes C++ fournis sur le Web, et je ne me sens pas assez compétent pour baser toute mon application dans ce langage. Je voudrais m'en tenir à C#.

Y at-il d'autres façons d'ouvrir un port en C# en utilisant la classe SerialPort dans Windows CE? Ou peut-être utiliser d'autres classes entièrement?
Sinon, est-ce qu'il y a peut-être une DLL écrite en C++ qui permet la même fonctionnalité (ou similaire) disponible pour Windows CE?

EDIT (pour plus de détails): L'exception que je reçois est juste que. IOException. Le débogueur Visual Studio ne me dit rien de plus. Je ne sais pas si cela est dû à un réglage Windows CE bâclé sur l'appareil. Je me souviens d'un problème avec les chaînes d'exception sur mon appareil Windows Mobile, mais cela a été résolu en ajoutant une référence à System.SR, que j'ai déjà essayé dans ce cas. S'il y a un truc qui me manque en ce qui concerne Windows CE et les messages d'exception, j'aimerais aussi le savoir. ;)

J'ai aussi essayé d'utiliser le code sans événements et en spécifiant plusieurs paramètres dans le constructeur, et je avais toujours obtenir l'exception lorsque vous essayez d'ouvrir le port.

Enfin, j'ai déjà essayé d'ajouter un : au nom du port, ce qui n'a pas aidé non plus.

+0

N'utilisez pas de balises dans le sujet. Et vérifiez l'orthographe. S'il vous plaît. Bravo :) – abatishchev

+0

Je n'avais pas l'intention que ce soit une étiquette en tant que telle, mais la clarté concernant le titre. Mais tu as raison. Cependant la raison pour laquelle j'ai reculé était parce que vous avez écrit "probles" dans le titre ...>. < – Shaamaan

Répondre

0

Aucune des solutions proposées n'a fonctionné. Cette partie est restée "inopinable". Nous avons contourné le problème via une DLL native écrite en C++ qui ouvre le port et en lit les données.

Cette solution n'est pas idéale, mais c'est la meilleure solution que nous ayons trouvée.

Il s'agit d'une solution de contournement plutôt "longue" et suggère que quelque chose ne va pas avec Compact Framework dans ce cas particulier.

1

Je suggère de fournir plus d'options au constructeur; parité, bits d'arrêt et mode handshake.

SerialPort port = new SerialPort ("COM6", 9600, Parity.None, 8, StopBits.One); 
port.Handshake = Handshake.None; 
0

Actuellement, je ne suis pas tout à fait sûr, mais en utilisant l'API Win32 natif vous deviez appeler l'appareil par le nom COM6: et non seulement COM6. Mais je ne sais pas comment la classe C# SerialPort se comporte exactement sur ce point.

De plus je ne pense pas que ce soit un problème des paramètres utilisés, car ils vont venir plus tard dans le jeu. Donc, ma deuxième hypothèse serait que vos abonnements aux événements ajoutés pourraient peut-être conduire à un problème. Donc, juste pour être absolument sûr que je voudrais commenter les deux lignes où vous vous abonnez à ErrorReceived et DataReceived.

Aussi j'avais une fois aussi un échec assez bizarre. En regardant en arrière, il m'a semblé que j'avais mal écrit le nom du port, que les caractères ne sont pas les caractères ANSI par défaut dans mon fichier de code pour déclarer le nom du port. Ainsi, après la suppression et la réécriture du constructeur, le problème a soudainement disparu.

Last but not least, vous montriez dans votre code que le StackTrace throwed un WinIOError. Mais pourriez-vous peut-être mettre à jour votre question et nous dire le code d'erreur exact ou un message d'erreur?

0

Le nom du port CE doit être suffixé avec deux points, donc Chane à "COM6:"

0

pas vrai que deux points est nécessaire [Compact Framework 3.5 sur Windows CE 6.0R3]. J'ouvre mes ports série avec juste "COMn" ou "$ device \ COMn" pour les ports com où n> 9. Mais il semble que la version OpenNetCf qui était nécessaire pour V1 de Compact Framework nécessitait le deux-points.

Je suggère d'appeler la méthode statique SerialPort.GetPortNames() et de vérifier que le périphérique que vous avez codé en dur en tant que COM6 est en fait disponible dans le tableau de chaînes renvoyé.

1

J'ai eu le même problème, réinstallé System_SR_ENU.cab et NETCFv2. Cela a fonctionné sans problèmes après.

1

J'ai eu un problème similaire et le code suivant a fonctionné dans mon cas. J'ai dû accéder au port série d'une autre application au moins une fois afin de l'initialiser correctement. J'ai essayé d'ouvrir le port série comme un fichier normal (notez que j'ai utilisé "COM8:" au lieu de "COM8" pour le fichier).

//The settings object is defined elsewhere... 
settings.PortName = "COM8"; 

//Creates the serial port. 
SerialPort port = new SerialPort(); 
port.PortName = settings.PortName; 
port.BaudRate = settings.BaudRate;   
port.Parity = settings.Parity; 
port.DataBits = settings.DataBits; 
port.StopBits = settings.StopBits; 
port.ReadTimeout = 10000; 
port.DtrEnable = true; 
port.RtsEnable = true; 


string vComm = settings.PortName + ":"; 
FileStream stream = null; 
try 
{ 
    stream = new FileStream(vComm, FileMode.Open, FileAccess.Read); 
} 
catch 
{ 
    //pass  
} 
port.Open(); 
if(stream != null) 
    stream.Dispose();