begin process at 2010 02 10 06:49:21
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

API

 > 

transmission de fichier par le port série


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

transmission de fichier par le port série

mercredi 11 février 2004 à 10:42:36 | transmission de fichier par le port série

jackyjacky


Salur à vous
Je voudrais savoir si c'est assez facile de réceptionner un fichier par l'intermédiare du port série et si oui, si quelqu'un peut me proposer quelque chose.
de plus je vais certainement devoir créer une tâche de fond sous Windows 95, ma question est donc de savoir si c'est possible.

Mecri pour votre aide.
@++
mercredi 11 février 2004 à 13:37:14 | Re : transmission de fichier par le port série

ymca2003

voici une version épurée de mon prog serial qui ne fait que la réception (tous les paramètres sont en dur, pas de vérif d'erreurs). bouton recevoir débute la réception Stop l'arrête

Recep.cpp :


#include <windows.h>

#include "Resource.h"


// message rensignant sur le nb d'octets reçus
#define WM_COMM_RX(WM_USER + 0x100)


// variables globales
HINSTANCE g_hAppInstance = NULL; // instance de l'application
HWND g_hMainDlg = NULL; // boîte de dialogue
HANDLE g_hComm = NULL; // handle port série
HANDLE g_hThread = NULL; // handle thread de lecture
BOOL g_bRunning = FALSE; // vrai si thread doit continuer

int CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);

void CmdRecep();
void CmdStop();

DWORD WINAPI ThreadFunc(LPVOID);

//************************************************
//************************************************
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
g_hAppInstance = hInstance;
DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINDIALOG), NULL, DlgProc);
return 0;
}

//************************************************
//************************************************
int CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG :
{
g_hMainDlg = hDlg;
EnableWindow(GetDlgItem(hDlg, IDC_RECEP), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_STOP), FALSE);
return TRUE;
}
case WM_COMMAND :
{
switch(LOWORD(wParam))
{
case IDCANCEL : CmdStop(); EndDialog(hDlg, IDCANCEL); return TRUE;
case IDOK : CmdStop(); EndDialog(hDlg, IDOK); return TRUE;
case IDC_RECEP : CmdRecep(); return TRUE;
case IDC_STOP : CmdStop(); return TRUE;
}
return FALSE;
}
case WM_COMM_RX :
{
// mise à jour nombre d'octets reçu
char szText[64];
wsprintf(szText, "%d octets", lParam);
SetWindowText(GetDlgItem(hDlg, IDC_NB), szText);
}
}
return 0;
}

//************************************************
//************************************************
void CmdRecep()
{
// ouverture port série
g_hComm = CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL);
SetupComm(g_hComm, 4096, 4096);

// affectation délais
COMMTIMEOUTS cto;
ZeroMemory(&cto, sizeof(COMMTIMEOUTS));
cto.ReadIntervalTimeout = 0xFFFFFFFF;
SetCommTimeouts(g_hComm, &cto);

// affectation configuration
DCB dcb;
ZeroMemory(&dcb, sizeof(DCB));
dcb.DCBlength = sizeof(DCB);
dcb.BaudRate = 9600;
dcb.fBinary = TRUE;
dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcb.fRtsControl = RTS_CONTROL_ENABLE;
dcb.XonLim = 0x100;
dcb.XoffLim = 0x100;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.XonChar = 0x11;
dcb.XonChar = 0x13;
dcb.ErrorChar = '?';
dcb.EofChar = 0x1A;
dcb.EvtChar = 0x10;
SetCommState(g_hComm, &dcb);

// purge
PurgeComm(g_hComm, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
EscapeCommFunction(g_hComm, SETDTR);

// création thread de lecture
DWORD dwThreadId;
g_bRunning = TRUE;
g_hThread = CreateThread(NULL, 0, ThreadFunc, &g_bRunning, 0, &dwThreadId);

// mise à jour affichage
EnableWindow(GetDlgItem(g_hMainDlg, IDC_RECEP), FALSE);
EnableWindow(GetDlgItem(g_hMainDlg, IDC_STOP), TRUE);
SetWindowText(GetDlgItem(g_hMainDlg, IDC_NB), "");
}

//************************************************
//************************************************
void CmdStop()
{
// si pas de thread en cours
if(g_hThread == NULL)
return;

// on attend que le thread s'arrête tout en traitant les messages
// relatifs au port série
g_bRunning = FALSE;
while(WaitForSingleObject(g_hThread, 10) != WAIT_OBJECT_0)
{
// si un message relatif au port série est présent
MSG msg;
if(PeekMessage(&msg, NULL, WM_COMM_RX, WM_COMM_RX, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

// fermeture handles
CloseHandle(g_hThread);
CloseHandle(g_hComm);
g_hThread = NULL;
g_hComm = NULL;
EnableWindow(GetDlgItem(g_hMainDlg, IDC_RECEP), TRUE);
EnableWindow(GetDlgItem(g_hMainDlg, IDC_STOP), FALSE);
}

//************************************************
//************************************************
DWORD WINAPI ThreadFunc(LPVOID lpData)
{
// ouverture fichier de sortie, récup paramètres
HANDLE hFile = CreateFile("c:\\recep.txt", GENERIC_WRITE, 0, NULL,CREATE_ALWAYS, 0, NULL);
BOOL* pRunning = (BOOL*) lpData;

BYTE buffer[4096];
DWORD dwTotal = 0;

// tant que le thread doit tourner
while(*pRunning == TRUE)
{
// lecture d'un bloc
DWORD dwLength;
ReadFile(g_hComm, buffer, 4096, &dwLength, NULL);

// si pas de caractères reçus, faire une petite pause
if(dwLength == 0)
Sleep(10);
else
{
// écriture dans le fichier, notification dialogue
DWORD dwNbBytesWritten;
WriteFile(hFile, buffer, dwLength, &dwNbBytesWritten, NULL);
dwTotal += dwNbBytesWritten;
SendMessage(g_hMainDlg, WM_COMM_RX, 0, dwTotal);
}
}

// fermeture fichier de sortie
CloseHandle(hFile);
return 0;
}


Recep.rc :


#include "Resource.h"
IDD_MAINDIALOG DIALOG DISCARDABLE 0, 0, 142, 95
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Réception port série"
FONT 8, "MS Sans Serif"
BEGIN
PUSHBUTTON "Fermer",IDCANCEL,10,70,50,14
PUSHBUTTON "Recevoir",IDC_RECEP,10,20,50,14
PUSHBUTTON "Stop !",IDC_STOP,70,20,50,14
LTEXT "",IDC_NB,10,44,110,8
END



Resource.h :


#define IDD_MAINDIALOG 101
#define IDC_RECEP 1000
#define IDC_STOP 1002
#define IDC_NB 1003

mercredi 11 février 2004 à 16:37:09 | Re : transmission de fichier par le port série

jackyjacky


Est ce possible de mettre ce genre de programme en tache de fond?
mercredi 11 février 2004 à 20:01:34 | Re : transmission de fichier par le port série

ymca2003

il l'est déjà plus ou moins, il suffit de virer l'interface graphique et la réception se fait par le thread créé.
lundi 16 février 2004 à 16:20:03 | Re : transmission de fichier par le port série

jackyjacky


j'ai essayé de suivre le raisonnement de ton programme, mais je il est un peu compliqué par rapport à mon niveau de C.
Je ne suis pas sur de savoir où est stocké le fichier reçu ( je pense que c'est dans hFile) et je n'arrive pas à différencier complètement l'interface windows du reste du programme.
Donc j'espère que tu as un peu de temps afin de me le détaillé un peu plus
Merci d'avance.
lundi 16 février 2004 à 23:49:18 | Re : transmission de fichier par le port série

ymca2003

L'interface windows et contenu dans la fonction DlgProc (gestion clique des boutons et affichage progression).

ThreadFunc est le point d'entrée du thread créé (la tache de fond), qui scrute en permannece le port série. L'appel à la fct SendMessage permet de demander d'afficher la progression.

CmdRecep et CmdStop sont 2 fonctions qui permetent de commencer et d'arrêtrer cette tache (peuvent être appelée indépendant de l'interface graphique à partir d'un prog en mode console par ex)
jeudi 19 février 2004 à 15:23:35 | Re : transmission de fichier par le port série

jackyjacky


Bon j'ai réétudié mon problème, et je viens de voir que je ne pose pas les bonnes question.
Les commandes que tu me donnes ne sont pas compatibles avec mon soft car je suis sous DOS (Turbo C++ v3.0 càd du borland)
Donc si quelqu'un à quelque chose à me proposer je suis preneur...
Merci
vendredi 20 février 2004 à 17:53:56 | Re : transmission de fichier par le port série

ymca2003

En effet ce que je t'ai mis c'est pour Windows (API Win32).
Pour DOS, je ne sais pas comment faire.


Cette discussion est classée dans : fichier, port, série, blue, transmission


Répondre à ce message

Sujets en rapport avec ce message

transmission de fichier avec le port serie en C++ [ par dehmani ] Est-ce-que quelqun peut me faire un petit programme en C++ qui fait l'envoye et la reception d'un fichier avec le port serie? Vueillez me l'envoyer su Vitesse de transmission max sur port Série [ par Galmiza ] Salut,Dans les diverses lib série que j'ai vu que la vitesse de transmission maximale sur le port série est de 256kbps.Est-ce qu'on peut aller plus vi Envoi d'entier par le port série [ par nanalye ] Bonjour tout le mondeHelp !!!!Je veux envoyer des entiers par le port série et je voulais savoir si je peux le faire par le WriteFile ou si c seulemen communication avec le port série pour un jeu de rapidité [ par titan65 ] Bonjour, Je voudrais construire un jeu de buzzer à 4 joueurs (confronter 4 joueurs différents dans un jeu de rapidité) qui fonctionnerait de la maniè problèmes de débutant avec le port série et TComPort [ par titan65 ] Bonjour, D'abord sachez que je ne connais rien à C++! Voici mon objectif: faire arriver 4 signaux simples (chacun de valeur 0 ou 5V) sur 4 entrées du detourner port parallel [ par aberix ] Bonjour je cherche un bout de code en C pour detourner ce qui est envoyé sur le port parallel dans un fichier. Aujourd'hui il y a une imprimante texte Importer des données du port série vers Excel [ par Nicozo77100 ] Bonjour,Je souhaite récupérer des données qui arrivent sur le port série du pc et les écrire dans un fichier excel, qqun aurait il des sources permett Envoyer un caractère de controle en C vers un port série [ par Kurpeus1 ] Bonjour, Voila je ne suis pas un expert en C, mais j'y travaille ^^Je suis en train de programmer un programme qui communique avec un terminal portabl Ecriture port série --> Erreur 997 [ par julienbj ] Bonjour,Je suis en train de développer une petite classe (si on peut appeler ca comme ca en C) pour piloter mes ports séries.Rien de bien compliqué en classe communication port série [ par totoscill ] Bonjour à tous,Je me lance dans la communication entre mon PC et un GPS via le PORT série COM1.Malheureusement je n'ai jamais travailler avec le port


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,764 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales