在flutter/dart中读取串行端口

xpcnnkqh  于 12个月前  发布在  Flutter
关注(0)|答案(2)|浏览(337)

我无法读取串行端口,我尝试了flutter_libserialport文档中的多个片段,但没有运气。
我使用的是esp32,我在串行端口上发送一些数据,使用这个微Python代码:

from time import sleep

while True:
    print('{"firmware_type": "keypad", "value": 2}')
    sleep(1)

字符串
我的dart函数是:

void readSerialData() async {
    SerialPort port = SerialPort("/dev/cu.wchusbserial55390119721");
    final config = SerialPortConfig();
    config.baudRate = 115200;
    port.config = config;
    SerialPortReader reader = SerialPortReader(port, timeout: 10000);

    int bufferIndex = 0;

    Stream<Uint8List> upcomingData = reader.stream.map((data) {
      return data;
    });

    try {
      port.openReadWrite();

      List<int> buffer = [];
      upcomingData.listen((data) {
        buffer.addAll(data);
        bufferIndex += data.length;

        debugPrint('Raw data: $data');

        if (bufferIndex >= 5) {
          String strBuffer = String.fromCharCodes(buffer);
          debugPrint('Buffer: $strBuffer');
          bufferIndex = 0;
          buffer = [];
        }
      });
    } on SerialPortError catch (err, _) {
      debugPrint('SerialPortError: $err');
      port.close();
    } finally {
    }
  }


我的输出是:

flutter: Raw data: [101, 39, 58, 32, 50, 125, 13, 10, 39, 107, 101, 121, 112, 97, 100, 39, 44, 32, 39, 118, 97, 108, 117, 101, 39, 58, 32, 50, 125, 13, 10, 123, 39, 102, 105, 114, 109, 119, 97, 114, 101, 123, 39, 102, 105, 114, 109, 119, 97, 114, 101, 95, 116, 121, 112, 101, 39, 58, 32, 39, 107, 101, 121, 112, 97, 100, 39, 44, 32, 39, 118, 97, 108, 117, 101, 39, 58, 32, 50, 125, 13, 10, 123, 39, 102, 105, 114, 109, 119, 97, 114, 101, 95, 116, 121, 112, 101, 39, 58, 32, 39, 107, 101, 121, 112, 97, 100, 39, 44, 32, 39, 118, 97, 108, 117, 101, 39, 58, 32, 50, 125, 13, 10, 123, 39, 102, 105, 114, 109, 119, 97, 114, 101, 95, 116, 121, 112, 101, 39, 58, 32, 39, 107, 101, 121, 112, 97, 100, 39, 44, 32, 39, 118, 97, 108, 117, 101, 39, 58, 32, 50, 125, 13, 10, 123, 39, 102, 105, 114, 109, 119, 97, 114, 101, 95, 116, 121, 112, 101, 39, 58, 32, 39, 107, 101, 121, 112, 97, 100, 39, 44, 32, 39, 118, 97, 108, 117, 101, 39, 58, 32, 50, 125, 13, 10, 123, 39, 102, 105, 114, 109, 119, 97, 114, 101, 95, 116, 121, 112, 101, 39, 58, 32, 39, 107, 101, 121, 112, 97, 100, 39, 44, 32]
flutter: Buffer: e': 2}
flutter: 'keypad', 'value': 2}
flutter: {'firmware{'firmware_type': 'keypad', 'value': 2}
flutter: {'firmware_type': 'keypad', 'value': 2}
flutter: {'firmware_type': 'keypad', 'value': 2}
flutter: {'firmware_type': 'keypad',
lutter: {'firmware_type': 'keypad',
flutter: Raw data: [226, 161, 134]
flutter: Raw data: [196, 200, 30, 255]
flutter: Raw data: [167, 134, 158]
flutter: Raw data: [248, 240, 78, 255]
flutter: Raw data: [196, 132, 230]
flutter: Raw data: [238, 140]
flutter: Raw data: [255]
flutter: Raw data: [244, 232, 94, 255]
flutter: Raw data: [196, 132, 204]
flutter: Raw data: [242, 161, 134]
flutter: Raw data: [130, 33, 134]
flutter: Raw data: [249, 245, 66, 255]
flutter: Raw data: [196, 132, 204]
flutter: Raw data: [242, 129, 134]
flutter: Buffer: â¡�ÄÈ�ÿ§��øðNÿÄ�æî�ÿôè^ÿÄ�Ìò¡��!�ùõBÿÄ�Ìò��
flutter: Raw data: [238, 12, 63, 255]
flutter: Raw data: [249, 245, 66, 255]
flutter: Raw data: [74, 225, 249]
...


它似乎是阅读正确的数据在某个点,但然后是不工作了.因为它的工作有时我猜是无关的波特率,也我可以读它以及在Arduino串行监视器我的猜测是,它要么是不匹配的缓冲区大小或新行字符'\n',但我不知道如何解决.

vsmadaxz

vsmadaxz1#

为了确保您的串行数据实际上是完整的,使用像Putty或Tera-Term这样的终端来打开comport并查看数据。如果数据在终端中也损坏了,那么您可能与esp 32的连接不好,所以一定要检查一下。如果您有esp 32的副本,可能有一个便宜的<->USB转换器,它可能是罪魁祸首。
如果终端工作正常,请确保在dart代码中完全设置串行端口;如文档所示:SerialPortConfig class
在使用端口之前,您应该始终配置所有设置。库没有应用默认设置。当您打开端口时,它可能具有操作系统或驱动程序的默认设置,或者最后一个使用它的程序遗留的设置。[...]您应该始终设置波特率,数据位,奇偶校验和停止位。
所以一定要这样做。

zhte4eai

zhte4eai2#

正如我在之前的评论中提到的,问题并不是我的esp32没有发送任何东西。我可以用其他方式读取串行端口的输出,而不是使用flutter。问题是关于这里详细描述的一个可能的bug:https://github.com/jpnurmi/libserialport.dart/issues/24解决方法是首先从串行端口复制现有的配置,然后更改它,然后将副本分配回串行端口:

SerialPortReader reader = SerialPortReader(serialPort);   
serialPort.openReadWrite();   
SerialPortConfig config = serialPort.config; 
config.baudRate = 115200;   
serialPort.config = config;

字符串
还有一个变通办法,这不是一个选择,我是使用较低的波特率(9600)。

相关问题