2010-12-04 22 views
4

J'essaie d'écrire des données sur un port série via P/Invoke (explicitement pas avec la classe SerialPort). Voici ce que j'ai jusqu'à présent:L'appel P/Invoke s'arrête

[DllImport("kernel32", SetLastError = true)] 
static extern IntPtr CreateFile(string filename,  // file name 
           uint desiredAccess, // read? write? 
           uint shareMode,  // sharing 
           uint attributes,  // SecurityAttributes pointer 
           uint creationDisposition, 
           uint flagsAndAttributes, 
           uint templateFile); 

[DllImport("kernel32", SetLastError = true)] 
static extern bool WriteFile(IntPtr hFile,    // handle to file 
          byte[] lpBuffer,   // data buffer 
          uint nBytesToWrite,   // number of bytes to write 
          out uint nBytesWritten,  // number of bytes written 
          [In] ref NativeOverlapped overlapped); // overlapped buffer 

const uint OPEN_EXISTING = 3; 

_portHandle = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); 
uint bytesWritten; 
var buffer = Encoding.ASCII.GetBytes("foo\r"); 
var overlapped = new NativeOverlapped(); 
WriteFile(_portHandle, buffer, (uint)buffer.Length, out bytesWritten, ref overlapped); 

Je reçois un _portHandle = -1 et peut appeler WriteFile!. Mais après l'appel, ça ne fait rien. Je peux attendre indéfiniment en mode VS-debug et attendre que l'appel revienne. En outre, aucune exception n'est levée.

N'importe quel kernel32.dll-maîtres là-bas qui peut m'aider?

+0

-t-il se bloquer lorsque vous appelez les fonctions de code natif C? – ThiefMaster

+3

Y a-t-il une raison pour que vous utilisiez P/Invoke au lieu de la bibliothèque de framework géré pour faire cela? –

+0

Oui, Silverlight 5-preparation: p –

Répondre

0

série Taken Comm de John Hind (http://msdn.microsoft.com/en-us/magazine/cc301786.aspx) au lieu de développer mon propre :)

fonctionne très bien!

+0

J'essaie aussi de communiquer avec un périphérique série avec Silverlight 5, avez-vous pu utiliser ce code pour le faire? –

+0

Désolé pour la réponse tardive, mais oui, j'ai réussi à le faire fonctionner. Malheureusement, je l'ai fait pour mon ancienne entreprise et n'a donc plus le code. Btw, c'était avec la version bêta de Silverlight - peut-être quelque chose a changé entre-temps !? –

+0

Pas de problème, j'ai trouvé comment le faire fonctionner! Vous pouvez trouver comment j'ai fait ceci ici: http://stackoverflow.com/questions/8989538/serial-communication-with-silverlight-5-com-port/9092519#9092519 –

2

Merci de Papa Mufflon pour l'introduction de ce projet utilisable, je l'ai dérivé moi-même et ai fait un projet opensource très simple à partir de celui-ci https://github.com/ebraminio/PInvokeSerialPort que vous pouvez également télécharger à partir de https://nuget.org/packages/PInvokeSerialPort.

-sûr ce projet est pas complet si aucune suggestion toute fonction demandant à ce sujet est précieux pour moi :)

+1

Il suffit de mentionner qu'il y a 2 demandes de tirage ouvertes dans GitHub maintenant (et l'un d'eux par moi^_ ^). –