OVH Cloud OVH Cloud

Lecture port série sur pocket pc

4 réponses
Avatar
Bart
Bonjour,

Je suis à la recherche de toute information me permettant de lire des
données GPS à travers le port série de mon PDA.
J'ai bien trouvé quelques trucs, (
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetcomp/html/pisapicf.asp )
mais qui ne transmettent que quelques octets de temps à autres, alors que
l'on devrait s'attendre à un flux continue de dizaines d'octets.

Merci.

4 réponses

Avatar
LEBRUN Thomas
Si c'est un port série (sur Pocket PC), tu dois utiliser 3 fonctions (CreateFile, WriteFile, ReadFile) qui te permettront de te connecter au port que tu veux afin de lire/ecrire des données dessus.

Cet artcile : http://www.codeguru.com/Csharp/Csharp/cs_network/remoting/article.php/c6015/
te donne les fonctions mais pour PC.
Comme j'en ai eu besoin pour faire marcher le bluetooth surr pocket PC, je te donne les fonction que j'ai utilisé

private int infileHandler = 0;
private int outfileHandler = 0;

public const uint GENERIC_READ = 0x80000000;
public const uint GENERIC_WRITE = 0x40000000;
public const int OPEN_EXISTING = 3;

[DllImport("coredll.dll", EntryPoint="WriteFile")]
public static extern bool WriteFile
(
int hFile,
Byte[] lpBuffer,
int nNumberOfBytesToWrite,
ref int lpNumberOfBytesWritten,
int lpOverlapped
);

[DllImport("coredll.dll", EntryPoint="ReadFile")]
public static extern int ReadFile
(
int hFile,
byte[] lpBuffer,
int nNumberOfBytesToRead,
ref int lpNumberOfBytesRead,
int lpOverlapped
);

[DllImport("coredll.dll", EntryPoint="CreateFile")]
public static extern int CreateFile
(
string lpFileName,
uint dwDesiredAccess,
uint dwShareMode,
IntPtr lpSecurityAttributes,
uint dwCreationDisposition,
uint dwFlagsAndAttributes,
IntPtr hTemplateFile
);

[DllImport("coredll.dll", EntryPoint="CloseHandle")]
public static extern bool CloseHandle
(
int hObject
);

[DllImport("coredll.dll", EntryPoint="GetLastError")]
public static extern int GetLastError();

et un exemple d'utilsiation, ci pour se connecter au bluetooth mais dasns ton cas, change juste le port et ce sera bon

private void Connect()
{
// port number for Bluetooth connection
int inPort = 0;
int outPort = 0;

// Ouverture des ports en fonction de la version
// du Pocket PC
if ( Environment.OSVersion.Version.ToString().StartsWith("3.0") )
{
// PPC 2002
inPort = 7;
outPort = 8;
}
else
{
// PPC 2003
inPort = 8;
outPort = 5;
}

// Opens the port Bluetooth for emission COM7;
infileHandler = CreateFile("COM" + inPort + ":", GENERIC_READ, 0, System.IntPtr.Zero, OPEN_EXISTING, 0, System.IntPtr.Zero);

Application.DoEvents();

if ( infileHandler == -1 )
{
if ( GetLastError() == 87 )
{
MessageBox.Show("Erreur d'ouverture des ports Bluetooth.nÊtes-vous sûr d'avoir allumer la radio Bluetooth ?", "Erreur d'ouverture des ports");
}
else
{
MessageBox.Show("Erreur d'ouverture du port COM" + inPort + ":nErreur: " + GetLastError(), "Erreur d'ouverture de port");
}
}

// Opens the port Bluetooth for reception COM8:
outfileHandler = CreateFile("COM" + outPort + ":",
GENERIC_READ | GENERIC_WRITE,
0, // comm devices must be opened w/exclusive-access
System.IntPtr.Zero, // no security attributes
OPEN_EXISTING, // comm devices must use OPEN_EXISTING
0, // not overlapped I/O
System.IntPtr.Zero);

Application.DoEvents();

if ( infileHandler == -1 )
{
if ( GetLastError() == 87 )
{
MessageBox.Show("Erreur d'ouverture des ports Bluetooth.nÊtes-vous sûr d'avoir allumer la radio Bluetooth ?", "Erreur d'ouverture des ports");
}
else
{
MessageBox.Show("Erreur d'ouverture du port COM" + outPort + ":nErreur: " + GetLastError(), "Erreur d'ouverture de port");
}
}
}

En esperant que cela t'aide :)

A+

--
LEBRUN Thomas
MCP Visual C# (70-316)


"Bart" a écrit :

Bonjour,

Je suis à la recherche de toute information me permettant de lire des
données GPS à travers le port série de mon PDA.
J'ai bien trouvé quelques trucs, (
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetcomp/html/pisapicf.<a href="http://www.ntsearch.com/search.php?q=asp&vV">asp</a> )
mais qui ne transmettent que quelques octets de temps à autres, alors que
l'on devrait s'attendre à un flux continue de dizaines d'octets.

Merci.





Avatar
Bart
Merci, mais je ne suis pas sur d'avoir tout capter, surtout sur l'exemple.

Sinon, comment faire pour placer les données reçues dans un chaîne ?

Merci.


"LEBRUN Thomas" <lebrun_thomas_at_hotmail.com> a écrit dans le message de
news:
Si c'est un port série (sur Pocket PC), tu dois utiliser 3 fonctions


(CreateFile, WriteFile, ReadFile) qui te permettront de te connecter au port
que tu veux afin de lire/ecrire des données dessus.

Cet artcile :


http://www.codeguru.com/Csharp/Csharp/cs_network/remoting/article.php/c6015/
te donne les fonctions mais pour PC.
Comme j'en ai eu besoin pour faire marcher le bluetooth surr pocket PC, je


te donne les fonction que j'ai utilisé

private int infileHandler = 0;
private int outfileHandler = 0;

public const uint GENERIC_READ = 0x80000000;
public const uint GENERIC_WRITE = 0x40000000;
public const int OPEN_EXISTING = 3;

[DllImport("coredll.dll", EntryPoint="WriteFile")]
public static extern bool WriteFile
(
int hFile,
Byte[] lpBuffer,
int nNumberOfBytesToWrite,
ref int lpNumberOfBytesWritten,
int lpOverlapped
);

[DllImport("coredll.dll", EntryPoint="ReadFile")]
public static extern int ReadFile
(
int hFile,
byte[] lpBuffer,
int nNumberOfBytesToRead,
ref int lpNumberOfBytesRead,
int lpOverlapped
);

[DllImport("coredll.dll", EntryPoint="CreateFile")]
public static extern int CreateFile
(
string lpFileName,
uint dwDesiredAccess,
uint dwShareMode,
IntPtr lpSecurityAttributes,
uint dwCreationDisposition,
uint dwFlagsAndAttributes,
IntPtr hTemplateFile
);

[DllImport("coredll.dll", EntryPoint="CloseHandle")]
public static extern bool CloseHandle
(
int hObject
);

[DllImport("coredll.dll", EntryPoint="GetLastError")]
public static extern int GetLastError();

et un exemple d'utilsiation, ci pour se connecter au bluetooth mais dasns


ton cas, change juste le port et ce sera bon

private void Connect()
{
// port number for Bluetooth connection
int inPort = 0;
int outPort = 0;

// Ouverture des ports en fonction de la version
// du Pocket PC
if ( Environment.OSVersion.Version.ToString().StartsWith("3.0") )
{
// PPC 2002
inPort = 7;
outPort = 8;
}
else
{
// PPC 2003
inPort = 8;
outPort = 5;
}

// Opens the port Bluetooth for emission COM7;
infileHandler = CreateFile("COM" + inPort + ":", GENERIC_READ, 0,


System.IntPtr.Zero, OPEN_EXISTING, 0, System.IntPtr.Zero);

Application.DoEvents();

if ( infileHandler == -1 )
{
if ( GetLastError() == 87 )
{
MessageBox.Show("Erreur d'ouverture des ports Bluetooth.nÊtes-vous sûr


d'avoir allumer la radio Bluetooth ?", "Erreur d'ouverture des ports");
}
else
{
MessageBox.Show("Erreur d'ouverture du port COM" + inPort + ":nErreur: "


+ GetLastError(), "Erreur d'ouverture de port");
}
}

// Opens the port Bluetooth for reception COM8:
outfileHandler = CreateFile("COM" + outPort + ":",
GENERIC_READ | GENERIC_WRITE,
0, // comm devices must be opened w/exclusive-access
System.IntPtr.Zero, // no security attributes
OPEN_EXISTING, // comm devices must use OPEN_EXISTING
0, // not overlapped I/O
System.IntPtr.Zero);

Application.DoEvents();

if ( infileHandler == -1 )
{
if ( GetLastError() == 87 )
{
MessageBox.Show("Erreur d'ouverture des ports Bluetooth.nÊtes-vous sûr


d'avoir allumer la radio Bluetooth ?", "Erreur d'ouverture des ports");
}
else
{
MessageBox.Show("Erreur d'ouverture du port COM" + outPort + ":nErreur: "


+ GetLastError(), "Erreur d'ouverture de port");
}
}
}

En esperant que cela t'aide :)

A+

--
LEBRUN Thomas
MCP Visual C# (70-316)


"Bart" a écrit :

> Bonjour,
>
> Je suis à la recherche de toute information me permettant de lire des
> données GPS à travers le port série de mon PDA.
> J'ai bien trouvé quelques trucs, (
>


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetcomp/html/pisapicf.<a
href="http://www.ntsearch.com/search.php?q=asp&vV">asp</a> )
> mais qui ne transmettent que quelques octets de temps à autres, alors


que
> l'on devrait s'attendre à un flux continue de dizaines d'octets.
>
> Merci.
>
>
>


Avatar
LEBRUN Thomas
Voici ma fonction de réecption des données (a noter qu'ellle a peut-être un bug, je viens de remarqué cela : en fait, le tableau de byte buffer contient les byes de ton message, a toi de transformer ce tableau de byte en chaine de caractères)

private void Receive()
{
Cursor.Current = Cursors.WaitCursor;

// Réception des données
int count = 300;
int n = 0;
bool bContinue = true;

byte [] buffer = new byte[count];

int DataReceive = 0;

System.Text.ASCIIEncoding e = new System.Text.ASCIIEncoding();

while ( bContinue )
{
bContinue = false;

DataReceive = ReadFile(infileHandler, buffer, buffer.Length, ref(n), 0);

Application.DoEvents();

if ( DataReceive == 0 )
{
MessageBox.Show("Erreur de réception des donnéesnErreur: " + GetLastError(), "Erreur de réception");
}
else
{
// Ici : insertion du contact dans la base
MessageBox.Show(e.GetString(buffer, 0, count));
}
}

Cursor.Current = Cursors.Default;

// Déconnexion des ports
Disconnect();
}

Je te previens: la communication entre C# et port série n'est pas un choses simple :)
--
LEBRUN Thomas
MCP Visual C# (70-316)


"Bart" a écrit :

Merci, mais je ne suis pas sur d'avoir tout capter, surtout sur l'exemple.

Sinon, comment faire pour placer les données reçues dans un chaîne ?

Merci.


"LEBRUN Thomas" <lebrun_thomas_at_hotmail.com> a écrit dans le message de
news:
> Si c'est un port série (sur Pocket PC), tu dois utiliser 3 fonctions
(CreateFile, WriteFile, ReadFile) qui te permettront de te connecter au port
que tu veux afin de lire/ecrire des données dessus.
>
> Cet artcile :
http://www.codeguru.com/Csharp/Csharp/cs_network/remoting/article.php/c6015/
> te donne les fonctions mais pour PC.
> Comme j'en ai eu besoin pour faire marcher le bluetooth surr pocket PC, je
te donne les fonction que j'ai utilisé
>
> private int infileHandler = 0;
> private int outfileHandler = 0;
>
> public const uint GENERIC_READ = 0x80000000;
> public const uint GENERIC_WRITE = 0x40000000;
> public const int OPEN_EXISTING = 3;
>
> [DllImport("coredll.dll", EntryPoint="WriteFile")]
> public static extern bool WriteFile
> (
> int hFile,
> Byte[] lpBuffer,
> int nNumberOfBytesToWrite,
> ref int lpNumberOfBytesWritten,
> int lpOverlapped
> );
>
> [DllImport("coredll.dll", EntryPoint="ReadFile")]
> public static extern int ReadFile
> (
> int hFile,
> byte[] lpBuffer,
> int nNumberOfBytesToRead,
> ref int lpNumberOfBytesRead,
> int lpOverlapped
> );
>
> [DllImport("coredll.dll", EntryPoint="CreateFile")]
> public static extern int CreateFile
> (
> string lpFileName,
> uint dwDesiredAccess,
> uint dwShareMode,
> IntPtr lpSecurityAttributes,
> uint dwCreationDisposition,
> uint dwFlagsAndAttributes,
> IntPtr hTemplateFile
> );
>
> [DllImport("coredll.dll", EntryPoint="CloseHandle")]
> public static extern bool CloseHandle
> (
> int hObject
> );
>
> [DllImport("coredll.dll", EntryPoint="GetLastError")]
> public static extern int GetLastError();
>
> et un exemple d'utilsiation, ci pour se connecter au bluetooth mais dasns
ton cas, change juste le port et ce sera bon
>
> private void Connect()
> {
> // port number for Bluetooth connection
> int inPort = 0;
> int outPort = 0;
>
> // Ouverture des ports en fonction de la version
> // du Pocket PC
> if ( Environment.OSVersion.Version.ToString().StartsWith("3.0") )
> {
> // PPC 2002
> inPort = 7;
> outPort = 8;
> }
> else
> {
> // PPC 2003
> inPort = 8;
> outPort = 5;
> }
>
> // Opens the port Bluetooth for emission COM7;
> infileHandler = CreateFile("COM" + inPort + ":", GENERIC_READ, 0,
System.IntPtr.Zero, OPEN_EXISTING, 0, System.IntPtr.Zero);
>
> Application.DoEvents();
>
> if ( infileHandler == -1 )
> {
> if ( GetLastError() == 87 )
> {
> MessageBox.Show("Erreur d'ouverture des ports Bluetooth.nÊtes-vous sûr
d'avoir allumer la radio Bluetooth ?", "Erreur d'ouverture des ports");
> }
> else
> {
> MessageBox.Show("Erreur d'ouverture du port COM" + inPort + ":nErreur: "
+ GetLastError(), "Erreur d'ouverture de port");
> }
> }
>
> // Opens the port Bluetooth for reception COM8:
> outfileHandler = CreateFile("COM" + outPort + ":",
> GENERIC_READ | GENERIC_WRITE,
> 0, // comm devices must be opened w/exclusive-access
> System.IntPtr.Zero, // no <a href="http://www.ntsearch.com/search.php?q=security&vV">security</a> attributes
> OPEN_EXISTING, // comm devices must use OPEN_EXISTING
> 0, // not overlapped I/O
> System.IntPtr.Zero);
>
> Application.DoEvents();
>
> if ( infileHandler == -1 )
> {
> if ( GetLastError() == 87 )
> {
> MessageBox.Show("Erreur d'ouverture des ports Bluetooth.nÊtes-vous sûr
d'avoir allumer la radio Bluetooth ?", "Erreur d'ouverture des ports");
> }
> else
> {
> MessageBox.Show("Erreur d'ouverture du port COM" + outPort + ":nErreur: "
+ GetLastError(), "Erreur d'ouverture de port");
> }
> }
> }
>
> En esperant que cela t'aide :)
>
> A+
>
> --
> LEBRUN Thomas
> MCP Visual C# (70-316)
>
>
> "Bart" a écrit :
>
> > Bonjour,
> >
> > Je suis à la recherche de toute information me permettant de lire des
> > données GPS à travers le port série de mon PDA.
> > J'ai bien trouvé quelques trucs, (
> >
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetcomp/html/pisapicf.<a
href="http://www.ntsearch.com/search.php?q=asp&vV">asp</a> )
> > mais qui ne transmettent que quelques octets de temps à autres, alors
que
> > l'on devrait s'attendre à un flux continue de dizaines d'octets.
> >
> > Merci.
> >
> >
> >





Avatar
Bart
Merci beaucoup.