jpnurmi / flutter_libserialport

Serial Port for Flutter
https://pub.dev/packages/flutter_libserialport
MIT License
139 stars 80 forks source link

Problème lecture et écriture #101

Closed Mael58 closed 1 month ago

Mael58 commented 2 months ago

Bonjour, je rencontre des difficultés avec l'écriture et la lecture sur mon port série. Lorsque j'essaie d'écrire sur le port série, j'ai l'impression que l'écriture se déroule correctement, mais je n'arrive pas à lire les données par la suite. Ci-dessous se trouve ma classe SerialPortManager.dart. Mon objectif est d'envoyer une trame pour ping le port serie Merci d'avance.

import 'dart:async';
import 'dart:convert';
import 'dart:typed_data';
import 'package:libserialport/libserialport.dart';
import '../models/ports.dart';
import 'package:flutter/material.dart';

class SerialPortManager implements Port {
  final BuildContext context;
  SerialPort? _port;
  final SerialPortConfig _config = SerialPortConfig();

  SerialPortManager(this.context);

  @override
  Future<void> connect(String portName) async {
    try {

      _port = SerialPort(portName);
      _config.baudRate= 115200;
      _config.bits = 8;
      _config.stopBits = 1;
      _config.parity = SerialPortParity.none;

      _port?.config = _config;

       _port!.open(mode: SerialPortMode.readWrite);

      showInformationDialog(context, "Port série connecté : $portName");
    } catch (e) {
      showInformationDialog(context, "Erreur lors de la connexion au port série : $e");
    }
  }

  @override
  Future<void> disconnect() async {
    try {
      if (_port != null) {
         _port!.close();
        showInformationDialog(context, "Port série déconnecté");
      }
    } catch (e) {
      showInformationDialog(context, "Erreur lors de la déconnexion du port série : $e");
    }
  }

  @override
  Future<String?> readData() async {

    try {
      if (_port != null) {
        Uint8List data =  _port!.read(100); // Ajoutez une limite de temps pour la lecture
        String receivedData = utf8.decode(data);
        showInformationDialog(context, "Données lues depuis le port série : $receivedData");
        return receivedData;
      } else {
        showInformationDialog(context, "Le port série n'est pas connecté.");
        return null; // Retourner null si le port n'est pas connecté
      }
    } catch (e) {
      showInformationDialog(context, "Erreur lors de la lecture des données du port série : $e");
      return null; // Retourner null en cas d'erreur
    }
  }

  @override
  Future<void> writeData(String data) async {

    try {
      if (_port != null) {
        _port!.write(Uint8List.fromList(utf8.encode(data)));

        showInformationDialog(context, "Données écrites avec succès sur le port série : $data");
      } else {
        showInformationDialog(context, "Le port série n'est pas connecté.");
      }
    } catch (e) {
      showInformationDialog(context, "Erreur lors de l'écriture des données sur le port série : $e");
    }

  }

  Future<void> ping() async {
    try {
      // Envoyez la commande de ping (trame)

      await commande(Uint8List.fromList([0xA2, 0x00, 0xB4, 0xBF, 0x08, 0x4E, 0xA1]));

      // Lisez la réponse
      String? reponse = await readData();

      if (reponse != null) {
        showInformationDialog(context, "Réponse du ping : $reponse");
      } else {
        showInformationDialog(context, "Aucune réponse du ping.");
      }

    } catch (e) {
      showInformationDialog(context, "Erreur lors du ping : $e");
    }
  }

  Future<void> commande(Uint8List data) async {
    try {
      // Assurez-vous que _port est initialisé correctement.
      if (_port != null) {
         _port!.write(data);
        showInformationDialog(context, "Données écrites avec succès sur le port série : $data");
      } else {
        showInformationDialog(context, "Le port série n'est pas connecté.");
      }
    } catch (e) {
      showInformationDialog(context, "Erreur lors de l'écriture des données sur le port série : $e");
    }
  }

// Remplacez les print par cette fonction
  void showInformationDialog(BuildContext context, String message) {
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        width: 300,
        backgroundColor: Colors.white.withOpacity(0.5),
        content: Text(message, style: TextStyle(color: Colors.black)),
        duration: Duration(seconds: 2),
        behavior: SnackBarBehavior.floating,
      ),
    );
  }

}