Flutter串口通信插件flserial的使用

发布于 1周前 作者 phonegap100 来自 Flutter

Flutter串口通信插件flserial的使用

flserial 是一个基于FFI(Foreign Function Interface)的Flutter插件,用于与RS232设备进行串口通信。该插件基于优秀的C语言库 wjwwood/serial 实现,支持多个平台,包括Linux、Windows、Android和MacOS。

使用示例

下面是一个完整的示例,展示了如何在Flutter应用中使用 flserial 插件进行串口通信。

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 flserial 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flserial: ^0.1.0  # 请根据实际版本号进行修改

然后运行 flutter pub get 来安装依赖。

2. 示例代码

以下是完整的示例代码,展示如何初始化串口、打开端口、发送数据并接收数据。

import 'package:flutter/material.dart';
import 'package:flserial/flserial.dart';
import 'package:flserial/flserial_exception.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _errorMsg = 'Unknown';
  final FlSerial _flserialPlugin = FlSerial();

  @override
  void initState() {
    super.initState();
  }

  Future<void> _testSerialPort() async {
    try {
      // 列出所有可用的串口
      if (FlSerial.listPorts().isEmpty) {
        throw FlSerialException(3, msg: "Port not found");
      }

      // 初始化串口
      _flserialPlugin.init();

      // 打开第一个可用的串口,波特率为115200
      _flserialPlugin.openPort(FlSerial.listPorts()[0].split(" - ")[0], 115200);

      // 监听串口数据
      _flserialPlugin.onSerialData.stream.listen((args) {
        if (args.len > 0) {
          setState(() {
            _errorMsg = args.serial.readList().toString();
          });
        }
      });

      // 设置串口参数
      _flserialPlugin.setByteSize8();
      _flserialPlugin.setBitParityNone();
      _flserialPlugin.setStopBits1();
      _flserialPlugin.setFlowControlNone();

      // 发送数据
      String msg = "Hello World!";
      var list = msg.codeUnits;
      _flserialPlugin.write(Uint8List.fromList(list));

      setState(() {
        _errorMsg = "Test OK";
      });
    } on FlSerialException catch (e) {
      setState(() {
        _errorMsg = e.msg;
      });
    } on Exception catch (ex) {
      setState(() {
        _errorMsg = ex.toString();
      });
    } finally {
      if (_flserialPlugin.isOpen() == FlOpenStatus.open) {
        _flserialPlugin.closePort();
      }
      _flserialPlugin.free();
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Column(
          children: [
            ElevatedButton(
              onPressed: _testSerialPort,
              child: const Text("Serial port test"),
            ),
            Center(
              child: Text('Message: $_errorMsg\n'),
            ),
          ],
        ),
      ),
    );
  }
}

3. 代码说明

  • 初始化串口:通过 _flserialPlugin.init() 初始化串口。
  • 打开端口:通过 _flserialPlugin.openPort(portName, baudRate) 打开指定的串口端口,并设置波特率。
  • 监听数据:通过 _flserialPlugin.onSerialData.stream.listen() 监听串口接收到的数据。
  • 设置串口参数:可以设置字节大小、校验位、停止位和流控制等参数。
  • 发送数据:通过 _flserialPlugin.write(data) 发送数据到串口。
  • 关闭端口:在完成操作后,通过 _flserialPlugin.closePort() 关闭串口,并通过 _flserialPlugin.free() 释放资源。

4. 注意事项

  • 确保你的设备已连接到正确的串口,并且串口驱动程序已正确安装。
  • 在不同的平台上,串口名称可能不同(例如,Windows上可能是 COM3,而Linux上可能是 /dev/ttyUSB0)。
  • 处理异常时,请确保捕获 FlSerialException 和其他可能的异常,以确保应用程序的稳定性。

通过上述步骤,你可以在Flutter应用中轻松实现串口通信功能。希望这个示例对你有所帮助!


更多关于Flutter串口通信插件flserial的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter串口通信插件flserial的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用flserial插件来实现串口通信的一个基本示例。这个示例假设你已经有一个Flutter项目,并且已经安装了flserial插件。如果还没有安装,可以通过在pubspec.yaml文件中添加依赖来安装:

dependencies:
  flserial: ^最新版本号  # 请替换为实际的最新版本号

然后运行flutter pub get来安装依赖。

1. 配置Android权限

由于串口通信涉及到硬件访问,你需要在AndroidManifest.xml文件中添加必要的权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <!-- 其他权限配置 -->

</manifest>

注意:对于Android 10及以上版本,还需要处理运行时权限请求,这里为了简化示例,我们假设用户已经授予了这些权限。

2. 初始化flserial并打开串口

在你的Flutter项目中,你可以通过以下代码来初始化flserial插件并打开串口进行通信:

import 'package:flutter/material.dart';
import 'package:flserial/flserial.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  FlSerial? _serial;
  String _data = "";

  @override
  void initState() {
    super.initState();
    _initSerial();
  }

  Future<void> _initSerial() async {
    // 初始化FlSerial实例
    _serial = FlSerial();

    // 打开串口(假设使用/dev/ttyS0,波特率9600)
    try {
      await _serial!.open('/dev/ttyS0', 9600);
      print("串口已打开");

      // 设置数据接收监听器
      _serial!.dataReceived.listen((Uint8List data) {
        setState(() {
          _data += String.fromCharCodes(data);
        });
      });

    } catch (e) {
      print("打开串口失败: $e");
    }
  }

  Future<void> _sendData(String data) async {
    if (_serial != null && _serial!.isOpen!) {
      try {
        await _serial!.write(data.codeUnits);
        print("数据已发送: $data");
      } catch (e) {
        print("发送数据失败: $e");
      }
    } else {
      print("串口未打开");
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter 串口通信示例'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            children: [
              TextField(
                decoration: InputDecoration(labelText: '发送数据'),
                onEditingComplete: () {
                  _sendData(TextField.currentTextEditingValue!.text);
                  TextField.clear(context); // 清空输入框
                },
              ),
              SizedBox(height: 16),
              Text('接收到的数据:\n$_data'),
            ],
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    // 关闭串口
    if (_serial != null && _serial!.isOpen!) {
      _serial!.close();
    }
    super.dispose();
  }
}

注意事项

  1. 串口路径:在示例中,我们使用的是/dev/ttyS0,这通常是在Linux系统上。在Android设备上,你可能需要使用如/dev/ttyUSB0/dev/ttyS1等不同的路径,这取决于你的设备和连接的串口设备。

  2. 权限处理:在实际应用中,你需要处理Android的运行时权限请求,特别是在Android 6.0及以上版本中。

  3. 错误处理:示例代码中的错误处理较为简单,你可能需要根据实际需求增加更多的错误处理和日志记录。

  4. 平台支持flserial插件主要支持Android平台,对于iOS平台,可能需要额外的配置或寻找其他解决方案。

这个示例提供了一个基本的框架,你可以根据实际需求进行扩展和修改。

回到顶部