flutter_libserialport如何实现串口通信

我在Flutter项目中使用flutter_libserialport库进行串口通信时遇到了一些问题。具体场景是需要通过串口与硬件设备进行数据交互,但不知道如何正确配置和实现。能否提供详细的示例代码说明如何初始化串口、设置参数(如波特率、数据位等)、发送和接收数据?另外,在Android和iOS平台上是否需要额外的权限配置或特殊处理?遇到数据丢失或通信不稳定时该如何排查?

2 回复

Flutter 中使用 flutter_libserialport 实现串口通信的步骤:

  1. 添加依赖:在 pubspec.yaml 中添加 flutter_libserialport: ^最新版本

  2. 获取可用串口

    List<String> ports = SerialPort.availablePorts;
    
  3. 打开串口

    final serialPort = SerialPort('COM3'); // Windows
    // 或 '/dev/ttyUSB0' // Linux
    serialPort.open();
    
  4. 配置参数(可选):

    final config = SerialPortConfig()
      ..baudRate = 9600
      ..bits = 8
      ..stopBits = 1
      ..parity = SerialPortParity.none;
    serialPort.config = config;
    
  5. 读写数据

    • 发送数据
      serialPort.write(Uint8List.fromList([0x48, 0x65])); // 发送字节
      
    • 读取数据(建议用 Stream 监听):
      serialPort.readStream.listen((data) {
        print('收到数据: $data');
      });
      
  6. 关闭串口

    serialPort.close();
    

注意

  • 需在 AndroidManifest.xml(Android)和 Info.plist(iOS)中声明权限。
  • 实际波特率等参数需与设备匹配。
  • 读写操作需处理异常(如 SerialPortError)。

示例代码约 20 行即可实现基础收发功能。

更多关于flutter_libserialport如何实现串口通信的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


Flutter 中使用 flutter_libserialport 实现串口通信的步骤如下:

  1. 添加依赖pubspec.yaml 中添加:

    dependencies:
      flutter_libserialport: ^0.2.0
    
  2. 配置权限

    • Android:在 android/app/src/main/AndroidManifest.xml 中添加:
      <uses-permission android:name="android.permission.INTERNET"/>
      
    • Linux:确保用户有串口设备访问权限。
  3. 核心代码实现

    import 'package:flutter_libserialport/flutter_libserialport.dart';
    
    class SerialPortHelper {
      SerialPort? _port;
      SerialPortReader? _reader;
    
      // 获取可用串口列表
      List<String> getAvailablePorts() {
        return SerialPort.availablePorts;
      }
    
      // 打开串口
      bool openPort(String portName, {int baudRate = 9600}) {
        try {
          _port = SerialPort(portName);
          final config = SerialPortConfig();
          config.baudRate = baudRate;
          config.bits = 8;
          config.stopBits = 1;
          config.parity = SerialPortParity.none;
          _port!.config = config;
          
          _reader = SerialPortReader(_port!);
          return true;
        } catch (e) {
          print("Error: $e");
          return false;
        }
      }
    
      // 监听接收数据
      void listen(Function(String) onDataReceived) {
        _reader?.stream.listen((data) {
          onDataReceived(String.fromCharCodes(data));
        });
      }
    
      // 发送数据
      void write(String data) {
        _port?.write(data.codeUnits);
      }
    
      // 关闭串口
      void close() {
        _reader?.close();
        _port?.close();
      }
    }
    
  4. 使用示例

    final helper = SerialPortHelper();
    
    // 打开串口
    if (helper.openPort('/dev/ttyUSB0', baudRate: 115200)) {
      // 监听数据
      helper.listen((data) {
        print('Received: $data');
      });
      
      // 发送数据
      helper.write('Hello Serial Port');
    }
    

注意事项

  • 实际设备路径需根据系统调整(如 Windows 为 COM1,Linux 为 /dev/ttyUSB0
  • 需处理异常和资源释放
  • 高频率数据通信建议使用缓冲机制

建议参考官方文档获取最新 API 和平台特定配置。

回到顶部