French Récupération de trame par liaison série RS232

Bastien Z

Member
Bonjour,
Mon cahier des charges est de recevoir des données d'une trame provenant d'un arduino qu'on doit récupérer sur une application android avec B4A. On doit faire ça par liaison série RS232, donc pas de Bluetooth ou de WiFi (cahier des charges oblige...)

Durant mes recherches, je suis arrivé à plusieurs solutions que j'ai ensuite testé.De ce fait, il peut y avoir des choses totalement inutile étant donné que j'ai pris beaucoup de choses sans vraiment savoir à quoi ca correspond.
Pour commencer, j'envoie un simple caractère donc a,b,c, etc... L'application gère très bien une lettre. Lorsque j'envoie 3 caractères, 1 fois sur 5 on a qu'un seul ou deux caractères qui est réceptionné et non 3. Bizarrement et sans comprendre pourquoi, on a trouvé que, lorsqu'on augmente les bauds, passant de 9600 à 115200bauds, les trois caractères s'affichent correctement. Or, quand on passe sur une trame de 12 caractères, le problème est de nouveau là. C'est à dire qu'on reçoit par moment qu'un ou deux caractères au lieu de toute la trame.


Voici le code Arduino ainsi que le code B4A ci dessous :

Code Arduino :

B4X:
int i, j;
char a = 'a';
void setup() {
  Serial.begin(9600);
}
void loop() {
  for (i = 0; i<26; i++){
    for (j = 0; j<11; j++){
    Serial.print(a);
      }
    Serial.println();
    delay(1000);
    a++;
    }
  a = 'a';
}



Code B4A :
B4X:
#Region  Project Attributes
    #ApplicationLabel: B4A Example
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
    #BridgeLogger: True
#End Region


#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region


Sub Process_Globals
    Private usbserial As felUsbSerial
    Private manager As UsbManager
    Private bc As ByteConverter
    Dim datachar As String
    Dim NewFont As Typeface
    Dim etat As Int = 0
    NewFont = Typeface.LoadFromAssets("7 Segment.ttf")
 End Sub


Sub Globals
    Private Label1 As Label
    Private Label2 As Label
    Private Label3 As Label
    Private Label4 As Label
End Sub


Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("Layout3")
    Label1.Typeface = NewFont
    If FirstTime Then
        manager.Initialize
    End If
    Dim btnConnect As Button
    btnConnect.Initialize("btnConnect")
    btnConnect.Text = "Connect"
    Activity.AddView(btnConnect, 10dip, 10dip, 100dip, 100dip)
End Sub


Sub btnConnect_Click
    'Label1.Text="Vous avez clicke sur le boutton"
    If manager.GetDevices.Length = 0 Then
        Log("No connected usb devices.")
    Else
        Dim device As UsbDevice = manager.GetDevices(0) 'assuming that there is exactly one device
        If manager.HasPermission(device) = False Then
          ToastMessageShow("Please allow connection and click again.", True)
          manager.RequestPermission(device)
        Else
          usbserial.Initialize("serial", device, -1)
          usbserial.BaudRate = 9600
          usbserial.DataBits = usbserial.DATA_BITS_8
          usbserial.StartReading
        End If
    End If
End Sub
Private Sub serial_DataAvailable (Buffer() As Byte)
    datachar = (bc.StringFromBytes(Buffer,"UTF8"))
    If datachar = "" Then   
    Else 
        Label1.Text= Null
        Label1.Text= datachar
    End If
End Sub
Sub Label1_Click
End Sub
 

klaus

Expert
Licensed User
Longtime User
Bienvenue dans le forum B4X !

Dans ton code tu ajoutes le caractère LF, nouvelle ligne, à la fin d'une ligne.
Il faut donc ajouter les textes qui arrivent aux précédents jusqu'au caractère LF.
Et gérer l'affichage dans le Label en conséquence.

Je te propose:
- Ajoutes Log(datachar) au début de la routine
B4X:
Private Sub serial_DataAvailable (Buffer() As Byte)
    datachar = (bc.StringFromBytes(Buffer,"UTF8"))
    Log(datachar)
    If datachar = "" Then   
    Else 
        ' Label1.Text= Null ' ceci n'est pas nécessaire
        Label1.Text= datachar
    End If
End Sub
Et regardes ce qui est affiché dans l'onglet Gestionnaire de bibliothèques (library Manager)
Tu devrais voir les textes qui arrivent, et voir le saut à la ligne.

Est-ce que tu sais que tu peux programmer l'Arduino avec B4R?
 

Bastien Z

Member
Merci pour votre réponse rapide !

Concernant les logs, je ne peut pas les visualiser sur l'ordinateur tout simplement parce que je déconnecte le téléphone après avoir extrait l'apk et l'avoir installé pour le connecter à l'Arduino qui nous envoie les données...

Pour ce qui est de B4R, je sais que le logiciel existe, or j'ai toujours appris avec Arduino et je ne me suis pas penché sérieusement sur le logiciel. Quels sont les avantages a utilisé B4R plutôt que l'IDE Arduino ?

Je vais essayer ce que vous m'avez dit, mais du coups sans le Log.
 

klaus

Expert
Licensed User
Longtime User
tout simplement parce que je déconnecte le téléphone après avoir extrait l'apk
Tu peux essayer de connecter le téléphone via wifi avec B4A Bridge.
Qu'entens-tu par 'extrait l'apk'?
Avec une liaison par USB, lâpk est automatiquement trahnféré sur le téléphone.
Il faut compiler le programme en mode 'Release' qui crée l'apk sur le téléphone.
upload_2019-12-11_17-37-51.png


Quels sont les avantages a utilisé B4R plutôt que l'IDE Arduino ?
A peu près le même language que B4A, B4i ou B4J, l'éditeur est le même, à part des spécificités à chaque produit.
Les utilisateurs habitués à B4A se trouvent dans un milieu familier.

Autre suggestion, pour voir si tous les caractères arrivent:
B4X:
Private Sub serial_DataAvailable (Buffer() As Byte)
    datachar = datachar & bc.StringFromBytes(Buffer,"UTF8")
    If datachar = "" Then
    Else
        Label1.Text= datachar
    End If
End Sub

As-tu vu la documentation:
B4X Booklets en Anglais et les trois premiers livrets en Français, lien au bas de la page de B4X Booklets.
 
Last edited:

Bastien Z

Member
En effet, on voit bien les caractères qui arrive. Maintenant notre problème est qu'il accumule les données. C'est-à-dire qu'il va nous afficher AAAAAA, puis AAAAAABBBBBB, puis AAAAAABBBBBBCCCCCC, puis la chaîne de caractère va dépasser la taille de notre label, du coups on ne voit plus s'il récupère bien les données. Du coups, j'aimerai effacer les données entre chaque envoie pour qu'il m'affiche à chaque fois AAAAAA, puis BBBBBB, etc...

J'ai essayé de quelques trucs comme mettre datachar = Null après l'affichage mais ça ne marche pas...
 

klaus

Expert
Licensed User
Longtime User
Ma proposition servait à vérifier que toutes les donnes arrivent.
Pour détecter le caractère LF et afficher le texte, essaies la routine ci-dessous:
B4X:
Private Sub serial_DataAvailable (Buffer() As Byte)
   Private i As Int
   Private txt1, txt2 As String
 
   datachar = datachar & bc.StringFromBytes(Buffer,"UTF8")
   i = datachar.IndexOf(Chr(10)) 'Cherche l'indice du caractère LF, i = -1 si pas trouvé
   If i >= 0 Then
       txt1 = datachar.SubString2(0, i) 'Extrait la partie avant LF, texte actuel
       txt2 = datachar.SubString(i + 1) 'Extrait la partie après LF. texte suivant
       Label1.Text= txt1
       datachar = txt2
   End If
End Sub

Attribuer Null à un String, datachar = Null, n'est pas conseillé car String ne connait pas Null.
Pour attribuer un String vide utilses simplement , datachar = "".
 
Last edited:
Top