Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C] Comunicazione Modem

    Ragazzi utilizzando il seguente codice non riesco ad avere risposta dal modem.
    premetto che nel file "miofile.txt" è presente la seguente stringa ATI1 e dovrei ricevere come risposta 255.
    Aiuto per piacere.
    codice:
    int main(int argc, char *argv[])
    {
    	
    	BOOL fSuccess; // gestione degli errori
    	
    	//parametri per la funzione WriteFile
    	int lpBuffer;
    	DWORD NumeroDiBytesDaScrivere = 1;
    	DWORD NumeroDiBytesScritti;
    	BOOL bResult;
    	
    	DCB dcb;
    	FILE *fp;
    	
    	
    	//apro la porta COM
    	HANDLE hCom = CreateFile("COM3", // ad esempio
    		GENERIC_WRITE,
    		0,
    		NULL,
    		OPEN_EXISTING,
    		0,
    		NULL
    		);
    	
    	// verifico l'effettiva disponibilità (potrebbe non esistere)
    	if(!hCom) {
    		printf("Problemi alla porta di comunicazione e relativo errore!!!\nEI=%d",GetLastError());
    		return 0; }
    	
    	// e verifico lo stato della stessa
    	
    	fSuccess = GetCommState(hCom,&dcb);
    	if (!fSuccess) {
    		printf("La porta selezionata è già in uso!!!: EI=%d",GetLastError());
    		return 0; }
    	
    	// Inizializzo la DCB con i parametri desiderati (non a piacere: vi sono delle regole) di ricezione/trasmissione
    	dcb.BaudRate = 115200; // velocità dei dati (bit) al secondo
    	dcb.ByteSize = 7; // numero di bit
    	dcb.Parity = 0; // parità
    	dcb.StopBits = 0; // numero di bits di stop
    	
    	
    	// e setto la porta COM con i valori sopra (9800/7/0/2)
    	// leggere con attenzione sul Win32 SDK gli ulteriori parametri di questa struttura
    	
    	fSuccess = SetCommState(hCom, &dcb);
    	// verifica dell'effettivo settaggio
    	if(!fSuccess) {
    		printf("settaggio non riuscito!!!: EI=%d",GetLastError());
    		CloseHandle(hCom);
    		return 0; }
    	
    	//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    	//apro il file da trasferire
    	
    	
    	fp = fopen("miofile.txt","r");
    	if(!fp) {
    		printf("problemi nel file!!\nEI=%d",GetLastError());
    		CloseHandle(hCom);
    		return 0; }
    	
    	printf("trasmissione in corso\n");
    	
    	//invio i dati alla porta COM
    	while( ( lpBuffer = fgetc(fp)) != EOF)
    	{
    		printf("%c",lpBuffer);
    		bResult = WriteFile(hCom, &lpBuffer, NumeroDiBytesDaScrivere, &NumeroDiBytesScritti, NULL) ;
    		if(!bResult) {
    			printf("errore in trasmissione dati"); // da studiare col valore di ritorno della GetLasError();
    			fclose(fp);
    			CloseHandle(hCom);
    			return 0; }
    	}
    	//end while( ( lpBuffer = fgetc(fp)) != EOF)
    	//end while( ( lpBuffer = fgetc(fp)) != EOF)
    	// chiudo il file trasmesso
    	ReadFile(hCom, &lpBuffer, NumeroDiBytesDaScrivere, &NumeroDiBytesScritti, NULL);
    	printf("carattere:%c\n",lpBuffer);
    	ReadFile(hCom, &lpBuffer, NumeroDiBytesDaScrivere, &NumeroDiBytesScritti, NULL);
    	printf("carattere:%c\n",lpBuffer);
    	ReadFile(hCom, &lpBuffer, NumeroDiBytesDaScrivere, &NumeroDiBytesScritti, NULL);
    	printf("carattere:%c\n",lpBuffer);
    	ReadFile(hCom, &lpBuffer, NumeroDiBytesDaScrivere, &NumeroDiBytesScritti, NULL);
    	fclose(fp);
    	
    	//chiudo la porta COM
    	bResult = CloseHandle(hCom);
    	if(!bResult) printf("errore sulla chiusura della porta COM\n");
    	
    	printf("FILE TRANSFER END\n");
    	return 0;
    }

  2. #2
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <winbase.h>
    
    int main()
    {
    	char lpBuffer;
    	DWORD NumeroDiBytesDaScrivere = 1;
    	DWORD NumeroDiBytesScritti;
    	BOOL bResult;
    	OVERLAPPED osWrite = {0};
    	DCB PortDCB;
    	DWORD dwBytesTransferred=0,timeout=10000;
    	HANDLE hComm,Rx;
    	COMMTIMEOUTS CommTimeouts;
    	FILE * fp;
    	int i;
    	char *porta="COM3:\0";
    	char *pippo;
    	char prova;
    	
    	
    	// Creazione dell handle relativo all apertura della porta in lettura(COM1)
    	Rx = CreateFile(porta,
    		GENERIC_READ | GENERIC_WRITE,
    		0,
    		0,
    		OPEN_EXISTING,
    		0,
    		0);
    	if (Rx == INVALID_HANDLE_VALUE)
    	{exit(0);}// error opening port; abort
    	
    	GetCommState(Rx,&PortDCB); // Preleva i setting attuali della porta
    	
    	// setting dei paramentri (9600 8N1)
    	PortDCB.BaudRate = 115200; // Current baud
    	PortDCB.fBinary = FALSE; // Binary mode; no EOF check
    	PortDCB.fParity = FALSE; // Enable parity checking
    	PortDCB.fOutxCtsFlow = FALSE; // No CTS output flow control
    	PortDCB.fOutxDsrFlow = FALSE; // No DSR output flow control
    	PortDCB.fDtrControl = DTR_CONTROL_DISABLE;
    	// DTR flow control type
    	PortDCB.fDsrSensitivity = FALSE; // DSR sensitivity
    	PortDCB.fTXContinueOnXoff = FALSE; // XOFF continues Tx
    	PortDCB.fOutX = FALSE; // No XON/XOFF out flow control
    	PortDCB.fInX = FALSE; // No XON/XOFF in flow control
    	PortDCB.fErrorChar = FALSE; // Disable error replacement
    	PortDCB.fNull = FALSE; // Disable null stripping
    	PortDCB.fRtsControl = RTS_CONTROL_DISABLE;
    	// RTS flow control
    	PortDCB.fAbortOnError = FALSE; // Do not abort reads/writes on
    	// error
    	PortDCB.ByteSize = 1; // Number of bits/byte, 4-8
    	PortDCB.Parity = NOPARITY; // 0-4=no,odd,even,mark,space
    	PortDCB.StopBits = ONESTOPBIT; // 0,1,2 = 1, 1.5, 2
    	
    	SetCommState(Rx,&PortDCB); // Setting della porta
    	
    	GetCommTimeouts(Rx,&CommTimeouts);// rivela i paramentri di timeout della porta
    	
    	CommTimeouts.ReadIntervalTimeout = timeout; // imposto i paramentri di timeout a mio piacimento
    	CommTimeouts.ReadTotalTimeoutMultiplier = 0;
    	CommTimeouts.ReadTotalTimeoutConstant = 0;
    	CommTimeouts.WriteTotalTimeoutMultiplier = 10;
    	CommTimeouts.WriteTotalTimeoutConstant = 1000;
    	
    	
    	fp = fopen("miofile.txt","r");
    	if(!fp) {
    		printf("problemi nel file!!\nEI=%d",GetLastError());
    		CloseHandle(Rx);
    		return 0; }
    	
    	printf("trasmissione in corso\n");
    	
    	//invio i dati alla porta COM
    	while( ( lpBuffer = fgetc(fp)) != EOF)
    	{
    		printf("%c",lpBuffer);
    		bResult = WriteFile(Rx, &lpBuffer, NumeroDiBytesDaScrivere, &NumeroDiBytesScritti, NULL) ;
    		if(!bResult) {
    			printf("errore in trasmissione dati"); // da studiare col valore di ritorno della GetLasError();
    			fclose(fp);
    			CloseHandle(Rx);
    			return 0; }
    	}
    
    lpBuffer=13;
    printf("\n");
    //printf("%c",lpBuffer);
    bResult = WriteFile(Rx, &lpBuffer, NumeroDiBytesDaScrivere, &NumeroDiBytesScritti, NULL) ;
    	
    	
    	
    	
    	SetCommTimeouts(Rx,&CommTimeouts); // setting dei paramentri di timeout su COM1
    	
    	
    	
    	
    	
    	
    	while(dwBytesTransferred==0)
    	{
    	ReadFile (Rx, // Port handle
    	&prova, // Pointer to data to read
    	1, // Number of bytes to read
    	&dwBytesTransferred, // Pointer to number of bytes
    	// read
    	NULL // Must be NULL for Windows CE
    	);
    	printf("carattere:=%c\n",prova);
    	}
    	
    	CloseHandle(Rx);
    
    }
    HO modificato il codice in questo modo prendendo spunto da un precedente messaggio lasciato nel FOrum....
    Il problema è sempre in ricezione dove non riesco a visualizzare OK

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Il ciclo di ricezione non e' corretto

    codice:
    while(1)
    {
       ReadFile (Rx, &prova, 1, &dwBytesTransferred, NULL);
    
       if(dwBytesTransferred==0) break;
    
       printf("%c",prova);
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Grazie mille sei stato gentilissimo....

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.