Bonjour,
J'essaye de faire fonctionner une application toute simple en visual basic qui doit recevoir des valeurs du port série pour ensuite les afficher dans une listbox, mais ça fonctionne de manière très aléatoire, j'ai tout un tas de messages d'erreur que je ne comprend pas même en cherchant sur le web , enfin rien qui correspond à mon application.
Le programme est issu de morceaux de codes trouvés sur le web que j'ai agencé à ma manière ( surement comme il faut pas ...)
Lorsque je reçois les données sur un terminal tout est OK donc j'exclue une erreur venant de l'extérieure , ou alors une erreur de timing ...
Grosso modo j'attend que le port reçoive quelque chose par le biais de l'évènement "SerialPort1_DataReceived" : aprés réception d'un nombre donné d'octets sur le port série cette fonction se déclenche et en appel une autre afin d'afficher les valeurs , je pensais qu'en réglant le paramétre "ReceivedBytestreshold" sur le nombre d'octet à recevoir tout allait se passer comme prévu sauf que j'ai ce message d'erreur "L'index se trouve en dehors des limites du tableau." lorsque je tente de lire les octets dans le buffer de réception ...
je ne sais pas quoi faire , tout les examples que je trouve sur le web ne correspondent pas à ce que je veux faire .
sachant que si je tente de lire un seul byte à la fois c'est ok et ça a marché a peu prés correctement il y a 3 jours j'affichais les valeurs comme je le voulais , mais je pense que ma "méthode " de réception n'est pas bonne et j'ai rien trouvé de mieux .
Avant je me servais d'un timeout d'un timer pour lire le buffer toute les X secondes mais j'ai lu que c'est pas le mieux .
Depuis j'utilise ça :
Mais je comprend pas tout ....Code HTML:Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived 'Handles serial port data received events UpdateFormDelegate1 = New UpdateFormDelegate(AddressOf acquisition) Dim n As Integer = SerialPort1.BytesToRead 'find number of bytes in buf comBuffer = New Byte(n) {} 're dimension storage buffer SerialPort1.Read(comBuffer, 0, n) Me.Invoke(UpdateFormDelegate1) 'call the delegate
De plus je n'ai plus la possibilité de mettre le programme en pause j'ai ce message :" la pile d'appel contient du code externe" aucune source disponible.
Merci pour votre aide.
Voila le programme , enfin je sais pas si on peut appeler ça comme ça :
Code HTML:Imports System.IO Imports System.IO.Ports Imports System.Threading Public Class Form1 Shared _continue As Boolean Private SerialPort As New SerialPort Private comBuffer As Byte() Private Delegate Sub UpdateFormDelegate() Private UpdateFormDelegate1 As UpdateFormDelegate Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load SerialPort1.Close() AddHandler SerialPort1.DataReceived, AddressOf SerialPort1_DataReceived End Sub Private Sub Boutonconnecter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Boutonconnecter.Click SerialPort1.PortName = "COM8" 'change com port to match your Arduino port SerialPort1.BaudRate = 19200 SerialPort1.DataBits = 8 SerialPort1.Parity = Parity.None SerialPort1.StopBits = StopBits.One SerialPort1.Handshake = Handshake.None ' SerialPort1.Encoding = System.Text.Encoding.Default 'very important! Boutonconnecter.Enabled = False Boutonconnecter.Enabled = True Try SerialPort1.Open() Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub Private Sub Boutonfermer_Click(sender As Object, e As EventArgs) Handles Boutonfermer.Click Boutonfermer.Enabled = False Boutonfermer.Enabled = True SerialPort1.Close() End Sub Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived 'Handles serial port data received events UpdateFormDelegate1 = New UpdateFormDelegate(AddressOf acquisition) Dim n As Integer = SerialPort1.BytesToRead 'find number of bytes in buf comBuffer = New Byte(n) {} 're dimension storage buffer SerialPort1.Read(comBuffer, 0, n) Me.Invoke(UpdateFormDelegate1) 'call the delegate End Sub Dim flag As Integer Dim start As Integer Dim checksum1 As Integer Dim checksum2 As Integer Dim checksum3 As Integer Dim checksum4 As Integer Dim checksumpic As Integer Dim checksumpc As Integer Dim adress As Short Dim mesurelsb As Integer Dim mesuremsb As Integer Dim mesure As Integer Dim erreur As Byte Dim checksumbyte As Integer Dim increment As Integer Private Const start_transmit = 1 Private Sub acquisition() adress = 0 increment = 0 'While Not flag 'start = CStr(comBuffer(increment)) ' rechercher dans le buffer le start byte ' If start = start_transmit Then flag = 1 'increment += 1 ' End While checksum1 = CStr(comBuffer(0)) If checksum1 > 57 Then checksum1 -= 7 checksum1 = checksum1 - 48 ' conversion code ascii--> numérique checksum2 = CStr(comBuffer(1)) If checksum2 > 57 Then checksum2 -= 7 checksum2 = checksum2 - 48 ' conversion code ascii--> numérique checksum3 = CStr(comBuffer(2)) If checksum3 > 57 Then checksum3 -= 7 checksum3 = checksum3 - 48 ' conversion code ascii--> numérique checksum4 = CStr(comBuffer(3)) If checksum4 > 57 Then checksum4 -= 7 checksum4 = checksum4 - 48 ' conversion code ascii--> numérique checksumpic = checksum1 + (checksum2 << 4) + (checksum3 << 8) + (checksum4 << 12) TextBox1.Text = checksumpic [COLOR="#FF0000"]For adress As Short = 4 To 100 // ça merde ici en général mesurelsb = CStr(comBuffer(adress)) If mesurelsb > 57 Then mesurelsb -= 7 mesurelsb = mesurelsb - 48 adress += 1 mesuremsb = CStr(comBuffer(adress)) If mesuremsb > 57 Then mesuremsb -= 7 mesuremsb = mesuremsb - 48[/COLOR] mesure = mesurelsb + (mesuremsb << 4) checksumpc = checksumpc + mesure ListBox1.Items.Add(mesure) 'ajoute chaque mesure dans une liste Next checksumbyte = checksumpic + checksumpc If checksumbyte <> 0 Then erreur = 21 Else erreur = 6 'send_status(erreur) TextBox1.Text = checksumbyte 'calcul du checksum et comparaison avec le checksum du pic End Sub End Class
-----