PDA

Visualizza la versione completa : [C] Comunicazione Modem


francescoprogc
23-01-2008, 10:35
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.


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;
}

francescoprogc
23-01-2008, 13:31
#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

oregon
23-01-2008, 15:15
Il ciclo di ricezione non e' corretto



while(1)
{
ReadFile (Rx, &prova, 1, &dwBytesTransferred, NULL);

if(dwBytesTransferred==0) break;

printf("%c",prova);
}

francescoprogc
23-01-2008, 15:36
Grazie mille sei stato gentilissimo....

Loading