Newsgroup: it.comp.programmare.win32
Titolo: [HELP] Comunicazione seriale con Visual C++

Ciao a tutti,
sto cercando di scrivere un programma in Visual C++ 6.0, sotto Windows XP,
che dovrebbe leggere e scrivere dalla porta seriale per comunicare con un
modem. Il problema e' che sembra che ogni volta che invio un comando AT al
modem, questo non riceva niente... Vi posto anche il codice... Se qualcuno
sa spiegarmi dove sbaglio mi fa un enorme favore!
#include <windows.h>
#include <stdio.h>
HANDLE hCommPort;
int main(){
 char buffer[100];
 const char *pcCommPort = "COM1";
 DWORD dBytesScritti;
 DCB dcb;
 // apriamo l'handle per la porta
 hCommPort = CreateFile(pcCommPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, 0, NULL);
 if(hCommPort == INVALID_HANDLE_VALUE){fprintf(stderr, "Error opening COM
device.\n");exit(-1);}
 if(!GetCommState(hCommPort, &dcb)){fprintf(stderr, "Error during
GetCommState().\n");exit(-1);}
 dcb.BaudRate = CBR_57600;
 dcb.ByteSize = 8;
 dcb.Parity   = NOPARITY;
 dcb.StopBits = ONESTOPBIT;
 if(!SetCommState(hCommPort, &dcb)){fprintf(stderr, "Error during
SetCommState().\n");exit(-1);}
 do{
  printf("Insert command: ");
  scanf("%s", buffer);
  if(!WriteFile(hCommPort, buffer, strlen(buffer), &dBytesScritti,
NULL)){fprintf(stderr, "Error during WriteFile().");exit(-1);}
 }while(TRUE);
 return 0;
}

 sa spiegarmi dove sbaglio mi fa un enorme favore!
Probabilmente non ci sono errori nel codice postato. Perň dopo la
SetCommState proverei ad alzare RTS e DTR tramite la EscapeCommFunction. 
Poi ci sarebbero un sacco di cose da verificare (anche dal punto di vista
hardware), ma comincia cosě e facci sapere.
Perň noto ora che hai scritto che sembra che il modem non riceva nulla...
Sei sicuro di questo o magari il modem riceve, ma non risponde?
Steve.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 SetCommState proverei ad alzare RTS e DTR tramite la EscapeCommFunction. 
In questo caso potresti anche settare RTS e DTR tramite gli appositi campi
della struttura DCB ovviamente.


Ora provo...
sono abbastanza sicuro del fatto che il modem non riceva niente, anche
perche' mandando un semplice "ATA" il modem dovrebbe prendere la linea (e si
sentirebbe...)
Provo e ti faccio sapere...intanto grazie!

Niente... ho provato come hai detto tu ma niente, non funziona...
"Steve_Aletto" <steve_al...@SPAMhotmail.com> ha scritto nel messaggio
news:bgdmnf$9mp$1...@news.newsland.it...


 perche' mandando un semplice "ATA" il modem dovrebbe prendere la linea
Solo se qualcuno stava chiamando (e cioč il modem riceve dei "RING"). Dal
codice postato non mi sembra tu stia leggendo dalla seriale, quindi come
fai a sapere se il modem ha risposto?
Altri controlli da fare: baud rate, cavo utilizzato, provare con
HyperTerminal, ...


No, con "ATA" il modem prende comunque la linea (provato con
hyper-terminal)...
Ho provato a impostare gli stessi parametri di configurazione di Hyper
Terminal ma niente...
"Steve_Aletto" <steve_al...@SPAMhotmail.com> ha scritto nel messaggio
news:bgdu4d$b67$1...@news.newsland.it...


 hyper-terminal)...
A me risulta che "ATA" dice al modem "Answer a call", comunque non ci
metterei la mano sul fuoco.
Per curiosità, che valore ritorna nella variabile dBytesScritti?


 Terminal ma niente...
Nel caso i byte non fossero trasmessi, prova a mettere
FILE_ATTRIBUTE_NORMAL come penultimo parametro della CreateFile.


Allora, mandando un "ATA" dBytesScritti vale 3.
Ho provato anche con FILE_ATTRIBUTE_NORMAL ma niente...
In ogni caso grazie x l'aiuto!
"Steve_Aletto" <steve_al...@SPAMhotmail.com> ha scritto nel messaggio
news:bge0vn$v4i$1...@news.newsland.it...


Aggiungo una cosa:
con GetCommModemStatus() sono riuscito a vedere che il modem sembra essere
correttamente in attesa (CTS ON, DSR ON)... Non so piu' cosa pensare!!!
Ho notato che in rete sembrano molti ad avere questi problemi...
"Steve_Aletto" <steve_al...@SPAMhotmail.com> ha scritto nel messaggio
news:bge0vn$v4i$1...@news.newsland.it...


 Ho notato che in rete sembrano molti ad avere questi problemi...
Sempre meno di quelli che non li hanno... :-)
A proposito, setta anche gli altri campi della struttura DCB.


Ho trovato cos'era...
Bastava aggiungere "\r\n" alla fine della stringa prima di inviarla...
Ciao!
"Steve_Aletto" <steve_al...@SPAMhotmail.com> ha scritto nel messaggio
news:bgl0i2$qed$1...@news.newsland.it...


 Bastava aggiungere "rn" alla fine della stringa prima di inviarla...
Azz... troppo ovvio per pensarci. Per la cronaca dovrebbe bastare anche il
solo CR (\r), ma per precisione č meglio CR+LF. Comunque, visto che il
modem riceveva qualcosa? Alla prossima.
