tarm / serial

BSD 3-Clause "New" or "Revised" License
1.62k stars 452 forks source link

not clear buffer splitting when reading #129

Open thedemoncat opened 1 year ago

thedemoncat commented 1 year ago

HI!!!

arduino App (platformio - esp8266)

#include <Arduino.h>
#include <ESP8266WiFi.h>

void setup() {
  // initialize serial:
  Serial.begin(9600);

}

void loop() {
  Serial.print("Hello world");
  delay(10000);   
}

golang app

package main

import "fmt"
import "log"
import "github.com/tarm/serial"

func main() {
    config := &serial.Config{
        Name: "COM3",
        Baud: 9600,
    }

    stream, err := serial.OpenPort(config)
    if err != nil {
        log.Fatal(err)
    }

    buf := make([]byte, 1024)

    for {
        n, err := stream.Read(buf)
        if err != nil {
            log.Fatal(err)
        }
        s := string(buf[:n])
        if s == "" {
            continue
        }
        fmt.Println(s)
    }
}

in the console I get this result:

API server listening at: 127.0.0.1:57847
H
ello world
H
ello world

Why is the first character read separately in the stream?

How to read a line correctly?

Thank you in advance!

orestonce commented 1 year ago

bufio.NewReader(stream).ReadLine()

FObersteiner commented 1 year ago

bufio.Scanner is another option I find quite useful. You can also set your custom Spiltter function there if your input data is not newline-separated.

slinky55 commented 7 months ago

Is there a way to set a custom timeout on bufio.NewReader()? I've set a timeout on the port itself as well

FObersteiner commented 7 months ago

Is there a way to set a custom timeout on bufio.NewReader()? I've set a timeout on the port itself as well

the underlying io.Reader does not implement a timeout - the idea here being that the reader finishes when the resource is closed or exhausted (EOF). So the correct way I think is to set the timeout on the port, which is your resource in this case. Note however that on Windows, this does not work with the original tarm/serial. There are a couple of forks that implement this feature (example from my fork).