WriteFile : Ecriture sur port série [Résolu]

el_teedee 498 Messages postés mercredi 7 juillet 2004Date d'inscription 13 juillet 2015 Dernière intervention - 20 juin 2005 à 16:37 - Dernière réponse : Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention
- 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#?
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 20 juin 2005 à 22:45
3
Merci
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#

Merci cs_coq 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 83 internautes ce mois-ci

Commenter la réponse de cs_coq
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 20 juin 2005 à 18:28
0
Merci
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+
Commenter la réponse de Lutinore
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 20 juin 2005 à 18:53
0
Merci
Peut etre que les classes FileStream et BinaryWriter peuvent faire ce boulot..
Commenter la réponse de Lutinore
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 20 juin 2005 à 23:52
0
Merci
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.
Commenter la réponse de Lutinore
el_teedee 498 Messages postés mercredi 7 juillet 2004Date d'inscription 13 juillet 2015 Dernière intervention - 21 juin 2005 à 10:31
0
Merci
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." ?
Commenter la réponse de el_teedee
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 21 juin 2005 à 11:08
0
Merci
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..
Commenter la réponse de Lutinore

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.