Probleme de lecture sur le port serie

jackyjacky Messages postés 23 Statut Membre -  
 unseulensemble -
Salut à tous
Je travaille avec VisualC++ 6.0 sous winNT
J'essaye de lire le port série, mais je n'arrive pas à lire son contenu en une seul fois.
Je pense que l'ideal serait de detecter le dernier caractere du fichier afin de stopper la lecture, mais ma variable de stockage est de type void* est donc je n'arrive pas à l'utiliser..
#include <windows.h>
#include <winbase.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <io.h>
#include <fcntl.h>

#define PORT1	"COM1"
#define PORT2	"COM2"

#define V1200	CBR_1200
#define V2400	CBR_2400
#define V4800	CBR_4800
#define V9600	CBR_9600

#define BITS_7	7
#define BITS_8	8

#define BIT_DE_STOP_1	ONESTOPBIT
#define BIT_DE_STOP_15	ONE5STOPBITS
#define BIT_DE_STOP_2	TWOSTOPBITS

#define PAS_DE_PARITE	NOPARITY
#define PARITE_IMPAIRE	ODDPARITY
#define PARITE_PAIRE	EVENPARITY

#define OK	1
#define KO	0

#define LG_TRAME	1

int ouvrecom(char *strPort,long Baudrate,int Bitsize,int parite,int bitstop);
int reception(void *lpbuf,unsigned int ncountmax,unsigned int *pcountread);
void fermecom();
int recup();

DCB g_DCB;
HANDLE g_hCom=0;

void main(void)
{
	char lpbuf[LG_TRAME];
	unsigned int countread=0;
	HANDLE handle;
	DWORD byte=0;
	int nCarALire;
	
	
	handle=CreateFile("fabien.txt",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);
	ouvrecom(PORT1,V9600,BITS_7,PAS_DE_PARITE,BIT_DE_STOP_1);
	for(;;){
		nCarALire=reception(lpbuf,LG_TRAME,&countread);
		printf("%s",lpbuf);
		WriteFile(handle,lpbuf,nCarALire,&byte,NULL);
		CloseHandle(handle);
		recup();

	}

}

int ouvrecom(char *strPort,long Baudrate,int Bitsize,int parite,int bitstop)
{
	g_hCom=CreateFile(strPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH|FILE_FLAG_NO_BUFFERING,NULL);
	PurgeComm(g_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
	g_DCB.DCBlength=sizeof(DCB);
	GetCommState(g_hCom,&g_DCB);
	g_DCB.BaudRate=Baudrate;
	g_DCB.ByteSize=Bitsize;
	g_DCB.Parity=parite;
	g_DCB.StopBits=bitstop;
	g_DCB.fDtrControl=DTR_CONTROL_DISABLE;
	SetCommState(g_hCom,&g_DCB);
	return 0;
}

int reception(void *lpbuf,unsigned int ncountmax,unsigned int *pcountread)
{
	COMSTAT Stat;
	DWORD Errors;
	unsigned int nCarALire;
	unsigned long NCarLus=0;
	int i=0;

	Sleep(500);
	ClearCommError(g_hCom,&Errors,&Stat);
	nCarALire=Stat.cbInQue;

	while(nCarALire==0)
	{
		ClearCommError(g_hCom,&Errors,&Stat);
		Sleep(500);
		nCarALire=Stat.cbInQue;
	}
	ReadFile(g_hCom,lpbuf,nCarALire,&NCarLus,NULL);
return nCarALire;
}

int recup()
{
	FILE *recept;
	char code[25];
	
	recept=fopen("fabien.txt","rb");
	fgets(code,20,recept);
	printf("\n%s\n",code);
	fclose(recept);
	strcat(code,".txt");
	printf("\n%s\n",code);
	rename("fabien.txt",code);
	return 0;
}

merci d'avance pour votre aide
A voir également:

1 réponse

Younes
 
Slt,je veux faire un programme sous matlab qu'il fai l'acquisition en temps réel via le port série RS232
et affiche les signaux en temps réel.merci d'avance
0
mouraddd
 
je vais faire mem truc appel moi stp
mourad.memo@hotmail.com
0
unseulensemble
 
Voici un code matlab qui affiche un 'A' sur le port RS232 (windows)

% Reference: https://cnx.org/contents/5984b918-82be-41b3-b2a1-00c170b79888@1
%%
%% Reinitialisation
close all
clear all
%clc
%% TEST
data = 65;
%% Initialisation du port serie
% PortCom - BaudRate - Parity - Data - Stop
!mode com1:9600,n,8,1
fid = fopen('com1:','w');
fwrite(fid,data,'int8');
%ICI = fread(fid,1);

% close com port connection
fclose(fid);

Je cherche presentement à le faire sur linux
0