Newsgroup: it.comp.lang.visual-basic
Titolo: Comunicazione con COM2

Buona sera a tutto il forum
Ho installato una bilancia elettronica per gestire in automatico i movimenti
di magazzino.
Il problema che chiedo di risolvere è il seguente:
riesco ad inviare delle stringhe di al display della bilancia ma non riesco
a leggere le risposte (ricevo solo ? cod. ascii 63). La bilancia funziona ho
provato la ricezione con Hyper terminal.
Allego i passi di codice utilizzati sapreste svelarmi l'arcano?
Trasmetto a 9600 baud-8 bit-no parità-1 stop. (in più non riesco a
modificare i settaggi in fase di programmazione).
Grazie ancora e ciao.                                     Francesca
Private Sub pb_invia_Click()
    Dim FileName    As String: FileName = "C:\BinFiles\inv.Exe"
    Dim FileData      As Byte
    Dim Offset          As Long
    Dim bytecount    As Long
    Dim strdato        As String
   If  Txt_testo = "" Then
      msg = MsgBox("Inserire il testo da trasmettere!", 0, "Attenzione")
     Txt_testo.SetFocus
    Exit Sub
  End If
  MSComm2.PortOpen = True
    'Scrive la stringa da inviare su file sequenziale'
  Open FileName For Output As #1
  Print #1, Txt_testo.Text
  Close #1
  Txt_testo.Text = ""
 'Legge la stringa dal file sequenziale in modo binario'
' INVIA stringa ---------------> questa parte funziona correttamente
   Open FileName For Binary Access Read As #1
       For Offset = 1 To FileLen(FileName)
           Get #1, Offset, FileData
           MSComm2.Output = Chr$(FileData)
      Next Offset
        MSComm2.Output = Chr$(13) ------> caratteri fissi da inviare dopo
ogni stringa
        MSComm2.Output = Chr$(10) ------>                 "
   Close #1
' RICEVE   che non funziona
    Dim FileNamer    As String: FileNamer = "C:\BinFiles\ric.Exe"
    Open FileNamer For Binary Access Write As #2
    bytecount = 0
 ' If MSComm2.CommEvent = comEvReceive Then                   'questo evento
non si verifica mai
    While MSComm2.InBufferCount > 0
       tmpstr = MSComm2.Input
       strlen = Len(tmpstr)
       For i = 1 To strlen
         FileData = CByte(Asc(Mid(tmpstr, i, 1)))
         bytecount = bytecount + 1
         Put #2, bytecount, FileData
       Next i
       tmpstr = ""
    Wend
' End If
  Close #2
MSComm2.PortOpen = False
  'Scrive la stringa di risposta'
      Open FileName For Input As #2
         Input #2, strdato
     Close #2
 Txt_testo.Text = strdato
End Sub

 wrote in message
t43L4.160617$pn3.1...@news.infostrada.it...

Non si verifica mai perchè il codice è scritto nel posto sbagliato, devi
cliccare sul controllo MSComm del form e scrvere il codice sotto la sezione
MSComm1_OnComm().
Per quanto riguarda la ricezione della stringa, io non so se ci sia un
carattere speciale per capire quale sia la fine della stringa ma, nel caso
in cui il caratetre sia lo stesso che gli hai mandato tu (chr$(13) &
chr$(10) , che puoi scrivere anche come vbCrLf), puoi utilizzare questo
codice
Private Sub MSComm1_OnComm()
    inpstr = inpstr & MSComm1.Input
    If InStr(inpstr, vbCrLf) Then
    ' non ho capito bene cosa fai con la stringa, ma qualunque cosa sia
falla qui
    inpstr = ""
    End If
End Sub
In questo caso imposta MSComm1.inputlen = 1 e MSComm1.RTHereshold = 1.
Altrimenti puoi impostare questi due valori entrambi a zero e prenderti
tutta la stringa di risposta in scrivendo il seguente codice dopo quello in
cui invii la stringa :
Do
    DoEvents
    inpstr = inpstr & MSComm1.Input
Loop Until InStr(inpstr, vbCrLf)
dopo del quale mandi inpstr dove devi mandarla e la azzeri (inpstr ="")
Spero di essere stato chiaro

Ho pubblicato qualche mex fa un esempio di ricezione da porta seriale con vb

Per modificare i parametri di comunicazione in fase di esecuzione io
utilizzo il codice
mdm.Settings = Format$(w_vel, "0") & "," & w_par$ & "," & Format$(w_dati,
"0") & "," & Format$(w_stop, "0")
dove mdm è naturalmente il mio controllo MScomm
La proprietà RThreshold determina l'evento ComEvReceive.
Se RThreshold = 0 l'evento non viene mai generato, comunque non ti conviene
settarla diversamente se poi non desideri una gestione ad eventi.
Dal momento che, come te, anch'io utilizzo il polling per leggere il buffer
di ricezione, questa è , più o meno, la funzione da me usata:
Public Function leggi() as String
  Dim buffer As Variant
  Dim arr() As Byte
  Dim dato As String
  Dim n As Long
  dato$ = ""
  tsyn = Timer + 10
  While dato$ = "" And Timer < tsyn
    ' Controlla la presenza di dati.
    If mdm.InBufferCount Then
      ' Legge i dati.
      mdm.InputLen = mdm.InBufferCount
      buffer = mdm.Input
      mdm.InputLen = 0
      arr = buffer
      ' Converte i dati letti in una stringa
      For n = 0 To UBound(arr)
        dato$ = dato$ + Chr$(arr(n))
      Next n
    End If
  Wend
   leggi=dato$
End Function
Ovviamente per utilizzarla la proprietà InputMode va settata a
comInputModeBinary.
Questo perchè altrimenti perdi tutti i caratteri di controllo eventualmente
ricevuti.
Resta solo da scandire quanto ritornato dalla funzione per la memorizzazione
nel file.
Ciao, Giorgio

 ha scritto nel messaggio
news:0XeL4.377$xt2....@news.infostrada.it...



Il metodo polling prende il controllo "assoluto" del sistema, quindi va bene
su macchine destinate esclusivamente a tale uso (e tale sistema va anche
contro il multitasking di winzozz).
Il metodo a interrupt è forse più complicato da gestire ma offre senz'altro
maggiore flessibilità.

 wrote in message 8dpjsj$spj$1...@news.IT.net...


Ciao Danilo o Francesca (non si capisce chi abbia postato loa richiesta di
aiuto).
Non ho capito molto del tuo messaggio (anche perche oggi non ho molto tempo
da dedicare al newsgroup ma ti do un consiglio che ti risolverà di certo il
problema.
In VB 5.0 ma credo anche in VB 6.0 nella directory
"C:\Programmi\DevStudio\VB\samples\CompTool\MSComm" risiede un progetto
scritto in VB che appronta un terminale per comunicazioni serali mostrando
non solo come configurare la porta ma anche come salvare le modifiche nel
registro a reperirle in una esecuzione successiva.
Copiando di sana pianta il progetto e riadattandolo un pochino ho
interfacciato bidirezionalmente 4 macchine per le analisi del sangue in un
laboratorio di analisi della mia citta. Se hai problemi scrivimi, ti
prometto fin da ora di dedicarti maggiori risorse.
Sperando di esserti stato utile ti saluto.
                                            Stefano. (
step...@libero.it
)
