Autore Topic: Accesso alla Porta Seriale  (Letto 1776 volte)

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.700
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Accesso alla Porta Seriale
« il: 12 Settembre 2012, 18:31:24 »
Accedendo alla porta seriale i 16 byte che devo leggere mi arrivano non di seguito.

L'accesso alla porta lo eseguo con il componente SerialPort così:
Codice: gambas [Seleziona]

Public Sub SerialPort1_Read()   
     Dim i As Integer
     Dim millisec As String
        While Not Eof(SerialPort1) 
               Read #SerialPort1, b 
                  s = CStr(b)
                   If b < 99 Then s = 0 & s
                    If b < 10 Then s = 0 & s
                     millisec = Right$(CString(Now), 3)
                      ss = ss & s                               ' compongo la stringa "sommando" i byte
                      Print s & " " & millisec
                    ' For i = 1 To 50000             ' impongo un ritardo  altrimenti salto dei byte
                    ' Next
        Wend
        TextArea2.Text = ss
        Split_byte(ss)          'chiamata alla subroutine Split_byte
        ss = ""                         'dopo aver mandato la stringa ss alla subroutine, qui viene  "azzerata"
     End
 '###################################


I byte sono 16 e i tempi di acquisizione risultano

042 796
062 806
000 806
000 806
076 806
065 806
083 806
079 806
078 815
069 815
065 815
087 815
082 815
082 815
000 815
000 815

Se tolgo il commento alle istruzioni:
Codice: gambas [Seleziona]

' For i = 1 To 50000             ' impongo un ritardo  altrimenti salto dei byte
                    ' Next


allora diventano:
042 719
062 736
000 746
000 766
076 775
065 802
083 822
079 .84
078 843
068 858
065 861
087 869
082 873
082 886
000 894
000 904

Il pacchetto di 16 byte è spedito correttamente, nel senso che con l'oscilloscopio ( e perdendo quasi la vista) ho ricostruito tutti i singolo bit e non ci sono anomalie sui tempi e sui bit di start e stop!

Sbaglio qualcosa o il componente SerialPort ha qualche problema?
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline doublemm

  • Maestro Gambero
  • ****
  • Post: 445
    • Mostra profilo
Re: Accesso alla Porta Seriale
« Risposta #1 il: 12 Settembre 2012, 18:42:43 »
Citazione
' For i = 1 To 50000             ' impongo un ritardo  altrimenti salto dei byte 
                   ' Next 

puoi usare WAIT
Matteo DoubleMM Mion

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.262
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Accesso alla Porta Seriale
« Risposta #2 il: 12 Settembre 2012, 21:07:12 »
Citazione
' For i = 1 To 50000             ' impongo un ritardo  altrimenti salto dei byte  
                   ' Next  

puoi usare WAIT
.......o forse anche solo semplicemente While True   :-X    anziché While Not Eof(SerialPort1) .  :-\
Ponendo True, la condizione risulta sempre vera, generando virtualmente un ciclo infinito. Dal ciclo si uscirà soltanto quando la Porta dirà che non c'è più niente da leggere.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline doublemm

  • Maestro Gambero
  • ****
  • Post: 445
    • Mostra profilo
Re: Accesso alla Porta Seriale
« Risposta #3 il: 12 Settembre 2012, 23:41:34 »
Citazione
Citazione
' For i = 1 To 50000             ' impongo un ritardo  altrimenti salto dei byte 
                   ' Next 

puoi usare WAIT
.......o forse anche solo semplicemente While True   Bocca cucita    anziché While Not Eof(SerialPort1) .  Indeciso
Ponendo True, la condizione risulta sempre vera, generando virtualmente un ciclo infinito. Dal ciclo si uscirà soltanto quando la Porta dirà che non c'è più niente da leggere.

in questo caso si, Ma il mio era un suggerimento in generale. Usare wait invece che un ciclo vuoto per creare una pausa.
Matteo DoubleMM Mion

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.262
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Accesso alla Porta Seriale
« Risposta #4 il: 12 Settembre 2012, 23:47:48 »
in questo caso si, Ma il mio era un suggerimento in generale. Usare wait invece che un ciclo vuoto per creare una pausa.
Certamente.
Io ho solo suggerito una mera ipotesi aggiuntiva.  :-\
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.700
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re: Accesso alla Porta Seriale
« Risposta #5 il: 13 Settembre 2012, 13:16:47 »
Quello che non mi piace è che nel primo caso ci sono ben 3 EoF per catturare 16 byte che arrivano da una periferica che li spedisce tutti insieme.
E' chiaro che se attendo un tempo sufficiente creo un EoF per ogni byte che ricevo, ma questa soluzione è "poco pulita"!
Mi viene da pensare ad un bug del componente SerialPort

Ho tentato allora di accedere alla porta così

Codice: gambas [Seleziona]

    Private fl As File 
    Public Sub Button1_Click() 
                fl = Open "/dev/ttyUSB0" For Read Watch 
     End       
           
    Public Sub File_Read()   
           
     Dim b As Byte   
           
    ' legge i dati "grezzi" provenienti dal file-device....   
        Read #fl, b   
           
    '...e li mostra in console:     
        Print b           
    End 

come suggerito da Vuott, ma non funziona forse perchè la porta va settata (velocità bit stop ecc)..e non ho trovato info su come si fa :-\
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.262
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Accesso alla Porta Seriale
« Risposta #6 il: 13 Settembre 2012, 13:25:08 »
come suggerito da Vuott, ma non funziona forse perchè la porta va settata (velocità bit stop ecc)..
...ma tu riesci comunque ad accedere ? Ad aprirla ?
Nell'altra tua precedente discussione, io avevo posto un comando bash per inserire la password di root per impostare il setUID, al fine di consentire l'apertura del file-device protetto di quella porta.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.700
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re: Accesso alla Porta Seriale
« Risposta #7 il: 13 Settembre 2012, 13:28:17 »
Si certo, e funziona.

Ma dopo aver modificato i permessi, con l'open del device e poi il read dei dati, non succede niente!
 :-\
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.262
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Accesso alla Porta Seriale
« Risposta #8 il: 13 Settembre 2012, 13:31:11 »
Si certo, e funziona.

Ma dopo aver modificato i permessi, con l'open del device e poi il read dei dati, non succede niente!
 :-\

.......forse non è proprio quello  :-X  il file-device dal quale intercettare i dati.  :-\
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.262
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Accesso alla Porta Seriale
« Risposta #9 il: 13 Settembre 2012, 18:34:18 »
.......forse non è proprio quello  :-X  il file-device dal quale intercettare i dati.  :-\

Ho fatto una prova: inserendo la penna per il collegamento internet mi compaiono due file-device:
* /dev/ttyUSB0
* /dev/ttyUSB1

Ho provato a leggerli in due modi differenti: con il programma SerialPort 3.0.0 presente nei programmi d'esempio in Gambas; e con il codice di apertura e lettura del file-device come ti avevo suggerito.

Ebbene, se provo a leggere il primo file-device /dev/ttyUSB0, con il programma SerialPort ottengo un errore: Cannot open serial port (5); se uso la lettura diretta del file-device, anche in questo caso mi ritorna un errore: System error #16: dispositivo o risorsa occupata.


Se vado a leggere invece il file-device /dev/ttyUSB1, riesco a leggerlo, ed ottengo i medesimi dati, sia con  il programma SerialPort (il quale li organizza ovviamente per benino leggibili in una TextArea), sia con l'algoritmo di lettura diretta e brutale del file-device che ti ho suggerito.


Quindi, mi sembra che, ...a questo punto, si riconferma, qualora ve ne fosse mai stata necessità, l'opportunità di usare la classe SerialPort.
« Ultima modifica: 19 Novembre 2013, 11:57:51 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Accesso alla Porta Seriale
« Risposta #10 il: 13 Settembre 2012, 18:40:38 »
Perdona kicco, ho letto questi ultimi post, e forse mi sono perso qualcosa prima ma leggo dal codice che hai postato, che è più o meno corretto, che riesci a ricevere tutti i byte nei tempi attesi, togliendo ovviamente quello che è solo di test (loop ritardo, ecc.).
I ritardi messi, i messaggi, qualsiasi cosa al di fuori di quello che riguarda la ricezione vera e propria, o che và ad interfacciarsi ad altre cose esterne anche interne al progetto, possono tutti portare comportamenti anomali, o comunque non controllabili direttamente, e che quindi vanno ad influire sui tempi di risposta che ti aspetti.
Dato che con gambas non puoi utilizzare gli interrupt direttamente, i tempi di elaborazione dipendono molto dall'ambiente, ovvero da quello che fà gambas.
Per verificare quanto dico, potresti provare a creare un progetto console, ovvero senza ambiente grafico, e quindi senza eventi che girano in background, e vedere se i tempi cambiano.
Una volta stabilite le differenze, puoi analizzare come gestire il tutto a livello di applicazione grafica, cercando di ottimizzare le cose in modo che vadano ad influire sui tempi di scambio dati in maniera più leggera possibile.

Oltre a questo, vedo anche stai usando un'interfaccia USB, con molta probabilità tramite convertitore USB-RS232. Già questo potrebbe comportare comportamenti un pò diversi dall'uso diretto di una seriale.

Come ultimo, fare attenzione ai diritti dati ai device. Eventualmente usare utenze impersonali, o aggiungendo l'utenza usata per l'applicazione al gruppo proprietario del device.

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.700
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re: Accesso alla Porta Seriale
« Risposta #11 il: 13 Settembre 2012, 22:12:51 »
che riesci a ricevere tutti i byte nei tempi attesi, togliendo ovviamente quello che è solo di test (loop ritardo, ecc.).
forse manca una negazione.... non riesco a ricevere tutti i byte....

Credo d'aver inteso il tuo discorso...
Ti confermo anche che sto usando una interfaccia USB-RS232.
Provo a lavorare senza grafica.

grazie :)
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.262
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Accesso alla Porta Seriale
« Risposta #12 il: 14 Settembre 2012, 00:32:14 »
Se vado a leggere invece il file-device /dev/ttyUSB1, riesco a leggerlo, ed ottengo i medesimi dati, sia con  il programma SerialPort (il quale li organizza ovviamente per benino leggibili in una TextArea), sia con l'algoritmo di lettura diretta ebrutale del file-device che ti ho suggerito.
Sono tornato su questa cosa, e ho visto che rispetto al programma SerialPort 3.0.0 si ottiene identico risultato visivo  :D delle righe di dati, intercettati dalla porta, raccogliendoli come stringhe:
Codice: gambas [Seleziona]

Public Sub File_Read()    
            
     Dim s As String

    While Not Eof(fl)
    ' legge i dati "grezzi" come stringhe provenienti dal file-device....  
        Read #fl, s, -256
'...oppure ovviamente anche così:
'       Line Input #fl, s

    '...e li mostra in console:      
        Print s
    Wend
            
End  
« Ultima modifica: 14 Settembre 2012, 01:45:28 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.262
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Accesso alla Porta Seriale
« Risposta #13 il: 14 Settembre 2012, 10:33:05 »
Mi viene da pensare ad un bug del componente SerialPort
Non credo vi sia un bug, poiché - come ho anche detto nel mio precedente messaggio -, dopo essere riuscito a capire come funziona il programma SerialPort 3.0.0, sono riuscito a vedere i dati provenienti - nel mio caso - dal file-device: /dev/ttyUSB1 .
Inoltre, ho fatto una controprova scrivendo un breve applicativo, con le funzioni della Classe SerialPort essenziali e necessarie per la lettura, ed ha funzionato.  :-\

Aggiungo - come suggerimento - di dare uno sguardo - qualora tu non l'abbia già fatto - anche a questa nota: http://www.gambas-it.org/smf/index.php?action=dlattach;topic=2266.0;attach=2561
la quale comunque riprende, approfondendole, le istruzioni del programma "SerialPort 3.0.0".
« Ultima modifica: 14 Settembre 2012, 11:32:16 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.262
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Accesso alla Porta Seriale
« Risposta #14 il: 23 Settembre 2012, 19:29:16 »
Quindi un'altra maniera per aprire e leggere la porta seriale ttyUSB1 può essere anche quella che utilizza la funzione .RunAsRoot() della classe Desktop. Detta funzione di gambas ti consente di lanciare un comando bash con password senza uso di Shell.
E' necessario impostare anche il componente gb.desktop:
Codice: gambas [Seleziona]

Private fl As File
Private sFile As String


Public Sub Form_Open()

' Utilizziamo un file temporaneo d'appoggio:
    sFile = Temp$()

   Desktop.RunAsRoot("cat /dev/ttyUSB1  > " & sFile)

   Do
      Wait 0.1
   Loop Until Exist(sFile)

   fl = Open sFile For Read Watch

End


Public Sub File_Read()

 Dim s As String

   s = File.Load(sFile)

   Print s

End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »