From 153748632a037cd6750f88e3a36f573e8ce21162 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Thu, 7 Nov 2019 10:28:54 +0100 Subject: [PATCH] Reinitialize serial buffer on every read to avoid concurrent rewrite buffered_ch was being rewritten with data being read on a later Read() Attention: this implementation "leaks" (ch will be garbage collected every time) Please profile the memory usage before merging --- serialport.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/serialport.go b/serialport.go index 7b2952a29..957828283 100755 --- a/serialport.go +++ b/serialport.go @@ -95,12 +95,13 @@ type SpPortMessageRaw struct { func (p *serport) reader() { //var buf bytes.Buffer - ch := make([]byte, 1024) timeCheckOpen := time.Now() var buffered_ch bytes.Buffer for { + ch := make([]byte, 1024) + n, err := p.portIo.Read(ch) //if we detect that port is closing, break out o this for{} loop. @@ -127,12 +128,9 @@ func (p *serport) reader() { for i, w := 0, 0; i < n; i += w { runeValue, width := utf8.DecodeRune(ch[i:n]) if runeValue == utf8.RuneError { - buffered_ch.Write(append(ch[i:n])) + buffered_ch.Write(ch[i:n]) break } - if i == n { - buffered_ch.Reset() - } data += string(runeValue) w = width }