Newsgroup: it.comp.lang.visual-basic
Titolo: Problemi comunicazione seriale

salve a tutti ho fatto un programmino di prova per l'invio di dati sulla 
seriale, il programma è questo:
Private Sub Command1_Click()
MSComm1.Output = "Ciao Mondo"
End Sub
Private Sub Form_Load()
MSComm1.CommPort = 2 ' Selezioniamo la COM1
    MSComm1.Settings = "9600,n,8,1" ' Le impostazioni della seriale
    MSComm1.RThreshold = 1 ' voglio essere informato della ricezione di ogni 
singolo carattere
    MSComm1.PortOpen = True ' Apriamo la porta.
End Sub
la com 2 la collego poi ad un altro PC con un cavo incrociato:
2----3
3----2
5----5
e gli altri pin li lascio scollegati, la configurazione delle 2 porte da 
winXP l'ho fatta cosi:
9600
8 bit dati
nessuna parita
1bit stop
nessun controllo di flusso
sul PC ricevente ho aperto Hyperterminal ma non ricevo nulla. Quale potrebbe 
essere il problema???
Grazie in anticipo

 essere il problema???
Non ho letto benissimo, ma prima controlla che "Ciao Mondo" usando 
HyperTerminal e non VB per trasmettere ti funzioni.
-- 
DBMS Firebird
VB6 + Ado

 End Sub
Devi selezionare la COM1 o la COM2?
Comunque è valido anche il consiglio di Andrea, magari controlla prima 
che i 2 pc "comunichino" attraverso la seriale con HyperTerminal.
-- 
Ciao da Stefano

"sbi82 [At Work]" <stefa...@NOOOOOOOOOOSPAMlibero.it> ha scritto nel 
messaggio news:mn.1c137d671...@NOOOOOOOOOOSPAMlibero.it...

Si scusa il commento è sbagliato perchè ho fatto un copia incolla la io sto 
usando la com2.
Come devo settare i vari parametri dell'hyperterminal il lato TX e in lato 
RX??
I settaggi che ho fatto nelle porte sono giusti? 

 I settaggi che ho fatto nelle porte sono giusti?
I settaggi mi sembrano giusti, io comunque proverei a vedere se si 
riesce a leggere/scrivere qualcosa con i due hyperterminal. Se va 
quello allora guardiamo cosa non va nel codice!
-- 
Ciao da Stefano

 guardiamo cosa non va nel codice!
ok la comunicazione tra 2 hyperterminal funziona e anche dal mio programma 
verso hyperterminal e viceversa, ora il mio problema è far comunicare il mio 
programma con il lettore di chiavi.
Allora se collego il lettore e guardo con hyperterminal vedo che mi 
trasmette continuamente la lettera "g" se però provo con il mio programma 
non ricevo nulla anche se provo mettendo un punto di interruzione nella 
routine di ricezione vedo che la esegue, questa è la routine:
Private Sub MSComm1_OnComm()
Dim Rx$
    Rx$ = MSComm1.Input ' Leggo il contenuto del buffer di ricezione (e 
svuoto .Input)
    If Len(Rx$) Then ' Se ho ricevuto qualcosa lo scrivo nella TextBox
        Text1.Text = Text1.Text & Rx$
    End If
End Sub
La variabile Rx però è sempre vuota.
Da cosa puo dipendere? 

 Da cosa puo dipendere?
Se non l'hai settato prova:
MSComm1.InputLen = 0
MSComm1.RThreshold = 1
Oppure magari serve una sorta di handshake ma almeno le g dovresti vederle
credo.


"Andrea" <nos...@invalid.invalid> ha scritto nel messaggio 
news:551tqrbib959.2...@40tude.net...

ma con il hyperterminal non faccio mica nessun handshake... 



Prova con una ricezione in polling del tipo:
Main.MsComm1.InputLen = 1 'legge un carattere alla volta
StrInp =""
Do:
     If Main.MsComm1.InBufferCount > 0 Then
         StrInp = StrInp & Main.MsComm1.Input
    Endif
Loop
'esci con Ctrl+Break
'Poi analizzi la stringa 
'con  Ctrl+F9 vai qui
For i= 1 to len(StrInp)
  Debug.Print Asc(mid$(StrInp, i, 1)
Next
Qualcosa dovresti vedere.
--
ciao
  Stefano

 Qualcosa dovresti vedere.
Ma questo codice in che posizione lo devo mettere lo devo mettere?
Main... per cosa sta? 

 ha scritto in
e8dp0q$b6c$
1...@nnrp-beta.newsland.it

Hai provato a modificare gli stop-bits da 1 a 2? Non saprei se serve, ma in
alcune applicazioni ho risolto così, e magari Hyperterminal ragiona come
queste applicazioni...

>>> Da cosa puo dipendere?
Allora forse ho capito il problema ma mi serve una conferma. Il problema 
dovrebbe stare nella parita, il mio aggeggio manda la parita pari. quindi io 
devo ricevere con parità pari. Come devo impostare  MSComm1.Settings?? 

Main... per cosa sta? 
Main è il nome che io uso per il form principale.
Questo nome poco fantasioso è probabilmente retaggio di un uso anche del C.
Di solito io metto una sola MsComm sul form principale (chiamato sempre Main) e
utilizzo solamente quella chiamandola anche da moduli o form secondari con
ad esempio   Main.Mscomm.Portopen = True.
--
ciao
  Stefano



E = Parità pari
Basta usare F1
Ti copio&incollo l'Help
_________________________
Sintassi
oggetto.Settings [ = valore ]
La sintassi della proprietà Settings è composta dalle seguenti parti:
Parte	Descrizione
oggetto	Espressione oggetto che definisce un oggetto dell'elenco "Si applica a".
valore	Espressione stringa che indica le impostazioni della porta di
comunicazione, come descritto di seguito.
Osservazioni
Se valore non è valido quando la porta viene aperta, il controllo MSComm genera
l'errore 380 (Valore di proprietà non valido).
L'argomento valore prevede quattro impostazioni, con il seguente formato:
"BBBB,P,D,S"
Dove BBBB è la velocità di trasmissione, P è la parità, D è il numero di bit di
dati e S il numero di bit di stop. Il valore predefinito di valore è:
"9600,N,8,1"
Nella seguente tabella sono elencate le velocità di trasmissione valide:
Impostazione 
110
300
600
1200
2400
9600 (impostazione predefinita)
14400
19200
28800
38400 (riservata)
56000 (riservata)
128000 (riservata)
256000 (riservata)
Nella seguente tabella sono elencati i valori di parità validi:
Impostazione 	Descrizione
E	Pari
M	Segno
N 	(Predefinita)
None	Nessuna
O	Dispari
S	Spazio
Nella seguente tabella sono elencati i valori di bit di dati validi:
Impostazione
4
5
6
7
8 
(Predefinita)
Nella seguente tabella sono elencati i valori di bit di stop validi.
Impostazione 	
1 	(Predefinita)
1.5	
2
_________________
--
ciao
  Stefano

 ha scritto nel messaggio 
news:vaqma2l53okmva7t2...@4ax.com...

Ti ringrazio perchè purtroppo nella mia versione di VB l'help non c'è... :-(
Cmq con la parità ho risolto era proprio quella che bloccava la ricezione.. 
Ma adesso che ricevo mi sono accorto di un altra cosa..
Io ricevo continuamente il comando 3Fh che è 00111111b mentre il dispositivo 
sono certo inviarmi continuamente 31h che è 00110001b.
c'è quindi qualche problema di conversione, la mia comunicazione è di questo 
tipo:
stop P b7 b6 b5 b4 b3 b2 b1 b0 start
dove b0 è LSB b7 MSB e P è la parità
il programma che ho fatto è questo:
Private Sub Form_Load()
MSComm1.CommPort = 2 ' Selezioniamo la COM2
    MSComm1.Settings = "9600,E,8,1" ' Le impostazioni della seriale
    MSComm1.RThreshold = 1 ' voglio essere informato della ricezione di ogni 
singolo carattere
    MSComm1.PortOpen = True ' Apriamo la porta.
End Sub
Private Sub MSComm1_OnComm()
Dim Rx$
    Text3.Text = MSComm1.CommEvent
    Shape1.BackColor = &HFF00&
    Rx$ = MSComm1.Input ' Leggo il contenuto del buffer di ricezione (e 
svuoto .Input)
    If Len(Rx$) Then ' Se ho ricevuto qualcosa lo scrivo nella TextBox
        Text1.Text = Str(Asc(Rx$))
    End If
    Shape1.BackColor = &HFF&
    cont = cont + 1
    Text2.Text = cont
End Sub
mi sai mica indicare qualcosa?? 

mi sai mica indicare qualcosa?? 
Ti avevo suggerito il polling perchè si testano meglio le porte, e
successivamente si può gestire un evento asincrono perchè è più complicato.
Inoltre se usi OnComm e la usi come si deve, devi anche fare una Select sul tipo
di evento o di errore che l'ha generato, come in questo esempio:
http://shorterlink.com/?KZKGSK
Qui c'è anche altro su OnComm:
http://shorterlink.com/?XTTT19
--
ciao
  Stefano