WriteFile : Ecriture sur port série

Résolu
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 - 20 juin 2005 à 16:37
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 - 21 juin 2005 à 11:08
Bonjour,



je voudrais écrire sur un port série que j'ai ouvert (la lecture marche
bien). Le problème c'est que, vu que je débute en C#, et que je n'ai
trouvé aucun exemple en C# de la fonction WriteFile, je suis sec !



Par contre j'ai trouvé partout la définition de cette fonction, mais je ne sais pas trop comment la mettre en oeuvre.



Voilà la définition de la fonction que l'on trouve facilement sur le net :



BOOL WriteFile(
HANDLE hFile, //Instance de votre accès au port série
LPCVOID lpBuffer, //Pointeur sur la donnée à écrire
DWORD nNumberOfBytesToWrite, //Nombre de bytes à écrire
LPDWORD lpNumberOfBytesWritten, //pointeur to number of bytes written
LPOVERLAPPED lpOverlapped //Doit être NULL pour windows CE
);


ainsi que l'exemple associé :



DWORD dwNumBytesWritten;
BYTE Byte = 'a';


if (!WriteFile (hPort, // Instance d'accès de votre port série
&Byte, //Pointeur sur la donnée à envoyer
1, //Nombre de byte à envoyer
&dwNumBytesWritten, //Pointer sur la variable contenant le nombre
//byte écrit dans le buffer
NULL)) //Doit être NULL pour Windows CE
{
//code d'erreur
}






Mais je ne comprends pas trop ce que DWORD signifie. Je ne sais
pas non plus comment je peux envoyer mon tableau de byte[] car j'ai des
erreurs avec le & et les pointeurs.

Bref si qqln pouvait me remettre les pendules à l'heure, ca ne me ferait pas de mal.



Est-ce que qqln a un exemple de communication sur port série en C#?

6 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
20 juin 2005 à 22:45
Salut,

Cet article pourra peut être t'aider : Use P/Invoke to Develop a .NET Base Class Library for Serial Device Communications

Cocoricoooooooo !!!!
coq
MVP Visual C#
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
20 juin 2005 à 18:28
Salut, ta fonction est en C, faut utiliser PInvoke pour faire un appel de plate-forme.. c'est un vaste sujet.. surtout que ta fonction est pas la plus simple.. faut convertir tout les types natifs en types manages, exemple : DWORD en INT32.. Si personne ne te donne de liens interessant je te ferai la conversion en C# plus tard, a+
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
20 juin 2005 à 18:53
Peut etre que les classes FileStream et BinaryWriter peuvent faire ce boulot..
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
20 juin 2005 à 23:52
Voila un lien interessant.. Ce n'est plus nécessaire que je te donne le prototype de WriteFile il est dans l'exemple..

Pas la peine de réécrire la structure OVERLAPPED comme dans l'exemple, utilises System.Threading.NativeOverlapped ou IntPtr.Zero si tu ne l'utilise pas.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
21 juin 2005 à 10:31
Merci pour le lien Coq, je pense que ca va m'aider. J'ai plus qu'à éplucher tout ça ;-)



La fonction est déclarée comme suit :

internal static extern Boolean WriteFile(IntPtr fFile, Byte[] lpBuffer, UInt32 nNumberOfBytesToWrite,

out UInt32 lpNumberOfBytesWritten, IntPtr lpOverlapped);

IntPtr c'est un pointeur, c'est bien ça ? Question : est-il possible de changer IntPtr en Int ou bien non ?



>Lutinore : dans l'exemple, la structure OVERLAPPED est déclarée comme suit :

[StructLayout( LayoutKind.Sequential )] internal struct OVERLAPPED

{

internal UIntPtr Internal;

internal UIntPtr InternalHigh;

internal UInt32 Offset;

internal UInt32 OffsetHigh;

internal IntPtr hEvent;

}

J'ai juste à reprendre ça, mais qu'est-ce que tu voulais dire par "utilises System.Threading.NativeOverlapped ou IntPtr.Zero si tu ne l'utilise pas." ?
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
21 juin 2005 à 11:08
Ca ne change pas grand chose, mais cette structure existe deja dans le framework, à System.Threading.NativeOverlapped, par contre tu ne vas peut etre pas en avoir besoin dans les parametres de ta fonction à ce moment là pour passer un parametre NULL comme dans le premier code que tu as donne plus haut , il faut utiliser IntPtr.Zero à la place de NULL, bon courage..
0
Rejoignez-nous