Newsgroup: it.comp.lang.visual-basic
Titolo: domanda su MSComm1

per fare delle prove ho scritto questo codice che invia il comando AT
al modem collegato alla porta com3.
Private Sub Form_Load()
    With MSComm1
        .CommPort = 3
        .PortOpen = True
        .Output = "AT" + vbCrLf
    End With
End Sub
Private Sub Timer1_Timer()
    Text1 = Text1 & MSComm1.Input
End Sub
la cosa strana è che però nella Text (in cui viene scritta la
risposta) prima dell'OK compaiono alcuni punti interrogativi come
questi "????|OK"
Perchè?

 questi "????|OK"
meno male!!!! Quello che vedi non è altro che la risposta del modem ai
comandi che hai inviato, in altre parole, quando devi iniziare la
comunicazione con il modem e non sai come è inizializzato puoi inviare la
stringa di comandi ATQ0V1E0 & Chr(13), in questo modo dici al modem di
visualizzare in modo testuale i cosidetti codici di risultato (fra i quali
trovi OK che è la risposta del modem ad un comando noto ed inviato
correttamente).
In quanto all'ultimo comando E0 significa solo di disabilitare l'eco locale
dei comandi inviati.
Per l'invio dei comandi devi premettere AT (a parte la sequenza di escape
+++ e qualche altro comando particolare) e terminare con il carattere di
controllo
del Carriage Return (CR) che equivale a Chr(13) oppure vbCr, in alcuni modem
più datati è anche richiesto l'ìinvio del Line Feed, quindi Chr(10) oppure
vbLf, in sostanza per essere sicuro li puoi inviare entrambi, come hai fatto
tu, utilizzando la costante predefinita vbCrLf.
Se ti serve altro sono a disposizione.
Ciao
Pow

> Se ti serve altro sono a disposizione.
ciao, come potrei provare una connessione null-modem? volevo provarlacon due
pc, uno con windows e uno in dos
mi servirebbe un programma dos che mi invia i dati, poi io proverei a
realizzarne uno in vbasic per leggerli
Suggerimenti?
grazie

 ha scritto nel messaggio
news:31J2c.54321$Kc3.1...@twister2.libero.it...

Per il programma in VB penso che tu sappia già come fare, utilizzando
MSComm, per il programma in DOS, se hai
dimestichezza con il C e l'ambiente Visual Studio potresti creare un piccolo
eseguibile operante in modalità console (DOS) che faccia quello
che ti serve.
Ovviamente dovrai definire un protocollo di comunicazione in modo tale che i
due applicativi sappiano quando inviare i dati, in
particolare devi partire con la trasmissione di un pacchetto di dati e
fermarti. Dal lato ricevente, una volta ricevuti tutti i dati del pacchetto
inviato
trasmetti un comando di acknowledge in modo da fare capire al programma di
trasmissione che il PC ricevente ha terminato la ricezione del pacchetto
inviato.
A questo punto dal PC trasmittente invii un altro pacchetto di dati e cosi
via fino al termine del file (questo è quello che ho fatto nel mio
programma per il trasferimento file con i modem). Operando in questo modo
sei sicuro che i due applicativi (quello di TX e quello di RX) saranno
sempre
sincronizzati e non corri il rischio di incorrere in errori di overflow del
buffer di ricezione.
Ovviamente la dimensione del pacchetto da inviare dovrà essere adeguata al
buffer di ricezione, intendendo con ciò un valore minore o uguale.
Ciao
Pow

buffer di ricezione, intendendo con ciò un valore minore o uguale.
Tutto giusto, ma giusto per allargare gli orizzonti:
Per semplificare le cose puoi usare i segnali RST\ e CTS\ per
stabilire quando il dispositivo deve inviare i dati.
La proprietà MsComm1.Handshaking = comRTS 
 del MSCOMM lo fa, Qb credo sempre.
(io usavo le Qblib se ti interessa ti invio quello che ritrovo,
per rispondere in mail togli il NOOOSPAM)
Usa gli standard STX(02h) per iniziare e  ETX(03h) per finire la
stringa,e al centro solo caratteri ASCII da 20h a 80h.
Per sicurezza è meglio inserire un checksum o BCC (può essere lo xor
di tutte le parole della stringa o gli otto bits bassi della somma, a
seconda selle scuole).
La stringa diventa: 02...dati....03 BCC
Se BCC<20h allora BCC=BCC+20h
ciao
Stefano


Alcuni anni fa realizzai un piccolo programma per pilotare un analizzatore
di stati logici in
QB, non vorrei prendere una cantonata, ma mi sembra che i comandi li inviavo
con delle
semplici Print#, le librerie che tu hai citato fanno parte di QB o sono di
terze parti?
Ciao
Pow


Esatto in QB la seriale si apre come un file com "OPEN COMx" e si
scrive con PRINT#x, e si cuide con CLOSE x
Le librerie che ho usato mi sembra di ricordare si chiamavano
'QBserial', non mi chiedere di piů perchč č roba di 10-12 anni fa. Da
qualche parte dovrei avere ancora un .zip, ma č un bel po che non le
uso.
ciao
 Stefano

 >
I fossil o fossili sono programmi che diciamo "aiutano" a gestire la seriale
o per meglio dire quello che ne deve uscire fuori (caratteri Ascii , etc...)
Sono programmi esterni che devono essere residenti in memoria....
io ne conosco un paio e sono:
X00  (sotto dos)
BNU (sotto dos)
WinFossil (che funziona sotto windows ma solo per 95/98 e su XP non gira)
Saluti.
Antonio.

 uso.
grazie per i consigli. Ancora non ci sono riuscito :-)
Ho scaricato un programmino in C che spara sulla com2 (sulla com1 c'e' il
mouse) una stringa
ho programmato in VB un algoritmo per la lettura della porta ma non
funziona.
Sono anni che non uso C e Asm altrimenti il programma per DOS l'avrei fatto
io.
In VB ho usato le API per aprire la com1 e per leggere i dati
SE avete consigli li accetto volentieri, anche magari dove scaricare
progarmmi gia' fatti e che posso studiare con calma
(uno per win e uno per DOS comunque, ho questo limite)
Grazie

 > > (Fossil mi sembra), che mi hanno risolto tutti i problemi.
[CUT]
Grazie ciao
Pow

 In VB ho usato le API per aprire la com1 e per leggere i dati
Le API o MSComm?
Ciao
Pow


Per WIN puoi trovare qualcosa sul sito comune
http://www.it-lang-vb.net/
Se non trovi qualcos'altro per il DOS ti consigio il Quickbasic o il
Qbasic di solito fornito insieme al dos da 5.00 a 6.22,  che però non
può creare l'exe.
Credo che si trovi qualche versione gratuita qb7.0, se n'è parlato
tempo fa,  gugla nei vecchi post
Comunque gestire una seriale in QB è abbastanza semplice:
Per darti l'idea copio e incollo un programma  QB per scrivere su un
file quello che manda la porta:
---------------------------------------------------------------------------
DEFINT A-Z
COLOR 7, 1: CLS                     ' Set screen color.
Quit$ = CHR$(0) + CHR$(16)      ' Value returned by INKEY$
                                ' when ALT+q is pressed.
PRINT : LINE INPUT "NOME DEL FILE DESTINAZIONE: "; A$
  ' Set up prompt on bottom line of screen and turn cursor on:
LOCATE 24, 1, 1
PRINT STRING$(80, "_");
LOCATE 25, 1: PRINT TAB(30); "Press ALT+q to quit";
' Open communications (9600baud, no parity, 8-bit data,
' 1 stop bit, 256-byte input buffer):
OPEN "COM1:9600,N,8,1" FOR RANDOM AS #1 LEN = 256
OPEN A$ FOR OUTPUT AS #2
DO                              ' Main communications loop.
   K$ = INKEY$           ' Check the keyboard.
   IF K$ = Quit$ THEN    ' Exit the loop if the user
      EXIT DO                   ' pressed ALT+q.
'  ELSEIF K$ <> "" THEN  ' Otherwise, if the user has
'     PRINT #1, K$;      ' pressed a key, send the
   END IF                       ' character typed to the modem.
    ' Check the modem. If characters are waiting (EOF(1) is
    ' true), get them and print them to the file destination file #2
   IF NOT EOF(1) THEN
      ' LOC(1) gives the number of characters waiting:
     LINE INPUT #1, M$
'     M$ = INPUT$(LOC(1), #1)
 
     IF ASC(LEFT$(M$, 1)) = 45 THEN EXIT DO      'End of trasmission
     PRINT #2, M$; ' ":";
   END IF
LOOP
RESET
CLS : PRINT : PRINT A$ + " LOADED"
END
-------------------------
ciao
  Stefano