Flutter 物联网开发 串口通信 适用于 Android windows 平台

2,475 阅读1分钟

前几天遇到公司需求要在Windows 平台开发 一个 项目,因为之前都是基于Android 系统 上开发,所以现在要把 之前Android 系统上的项目移植到 windows 系统上。所以我选择 使用Flutter 开发 兼容多平台方案。

一、选择Flutter 串口通信 插件

flutter_libserialport: ^0.3.0

}

二、集成 串口 导入依赖包并初始化串口

import 'package:flutter_libserialport/flutter_libserialport.dart';

}

三、封装接收串口数据方法(本方法解决了接收数据分包现象)

void _readData() async {
  // 读数据
  final reader = SerialPortReader(port, timeout: 10);
  List<String> list = [];
  if (!port.openReadWrite()) {
    print(SerialPort.lastError);
    return;
  }
  StringBuffer buffer = StringBuffer();
  int timeout = DateTime.now().millisecondsSinceEpoch;
  Timer.periodic(Duration(milliseconds: 5), (timer) {
    if (list.isNotEmpty) {
      int lastTime = DateTime.now().millisecondsSinceEpoch - timeout;
      if (lastTime > readTime) {
        for (var d in list) {
          buffer.write(d.toString());
        }
        Logger.info('接收数据${buffer.toString()}');
        buffer.clear();
        list.clear();
      }
    }
  });
  reader.stream.listen((data) {
    String hexString = data.map((byte) => byte.toRadixString(16)).join();
    //print('receivedHex: ${hexString.toUpperCase()}'); // 转换为16进制
    list.add(hexString);
    timeout = DateTime.now().millisecondsSinceEpoch;
  });
  //执行接下来的操作
}

四、发送串口数据方法(本方法解决发送黏包现象)

void senData(String sendData) async {
  if (sendData.isEmpty) {
    return;
  }
  int lastSendTimeout=DateTime.now().millisecondsSinceEpoch-sendTimeout;
  print(lastSendTimeout);
  if(lastSendTimeout>sendTime){
    List<int> dataList = [];
    int len = sendData.length ~/ 2;
    for (int i = 0; i < len; i++) {
      String data = sendData.trim().substring(2 * i, 2 * (i + 1));
      int? d = _hexToInt2(data);
      dataList.add(d!);
    }
    Logger.info('发送数据$sendData');
    Logger.info('发送数据${dataList.toString()}');
    var bytes = Uint8List.fromList(dataList);
    port.write(bytes);
    sendTimeout = DateTime.now().millisecondsSinceEpoch;
  }
}

五、初始化串口

SerialPortData(this.name) {
  print(name);
  port = SerialPort(name);
  port.config.baudRate = 115200;
  port.config.bits = 8;
  port.config.parity = 0;
  port.config.stopBits = 1;
  _readData();
感谢大家支持 有问题请留言