Uint8List 在 flutter dart 中加倍

Uint8List to double in flutter dart

我正在使用 flutter 蓝牙串口包从微控制器接收数据。当我从微控制器发送整数值时,我得到以下形式的值: [64], [144, 22]] 列表中的最后一个数字 (22) 是我发送的实际数字。但是,每次我发送任何值时,我也会得到这两个值 [64]、[144,...]。 另一件事是当我从微控制器发送一个浮点值时,我收到它作为 int 并且当我尝试将数据类型转换为双精度时,我得到这样的错误:

The argument type 'void Function(double)' can't be assigned to the parameter type 'void Function(Uint8List)?'.

The argument type 'double' can't be assigned to the parameter type 'List'.

下面是出现第一个错误的代码片段

List<List<double>> chunks = <List<double>>[];

_getBTConnection(){
    BluetoothConnection.toAddress(widget.server.address).then((_connection){
      connection = _connection;
      isConnecting = false;
      isDisconnecting = false;
      setState(() {});

      connection.input?.listen(_onDataReceived).onDone(() {
        if(isDisconnecting){
          print("Disconnecting locally");


        }else{
          print("Disconnecting remotely");

        }
        if(mounted){
          setState(() {});
        }
        Navigator.of(context).pop();

      });

    }).catchError((error){
      Navigator.of(context).pop();

    });
  }

下面是第二个错误的片段:


  void _onDataReceived(double data){
    if(data != null && data > 0){
      chunks.add(data);
     

    }

    if (kDebugMode) {
      print(" chunks: , $chunks " );
    }
  }

如果您在 Uint8List 中有一个 8(8 位)字节序列,您可以获得它的 ByteBuffer or ByteData 视图以将这些字节解析为 64 位 double.

例如:

import 'dart:typed_data';

void main() {
  // Big-endian byte sequence for pi.
  // See <https://en.wikipedia.org/wiki/Double-precision_floating-point_format>
  var bytes =
      Uint8List.fromList([0x40, 0x09, 0x21, 0xFB, 0x54, 0x44, 0x2D, 0x18]);
  var doubleValue = bytes.buffer.asByteData().getFloat64(0);
  print(doubleValue); // Prints: 3.141592653589793
}

尝试使用此代码将 Uint8List 转换为 List<double>

List<double> convertUint8ListToDoubleList(Uint8List uint8list) {
    var bdata = ByteData.view(uint8list.buffer);
    return List.generate(
        (uint8list.length / 8).round(), (index) => bdata.getFloat64(index * 8));
  }

您流中的数据类型是 Uint8List 吗?如果是Uint8List,你试过这段代码吗?

 void _onDataReceived(Uint8List data){
    if(data != null){
      chunks.add(convertUint8ListToDoubleList(data));
     

    }

    if (kDebugMode) {
      print(" chunks: , $chunks " );
    }
  }

如果您使用 List<double>chunks=[],请使用 List<double> convertUint8ListToDoubleList(Uint8List uint8list)