Reading from serial port with while-loop

前端 未结 2 1064
一个人的身影
一个人的身影 2021-01-05 10:03

I’ve written a short program in Go to communicate with a sensor through a serial port:

package main

import (
    \"fmt\"
    \"github.com/tarm/goserial\"
           


        
2条回答
  •  北海茫月
    2021-01-05 10:43

    I guess buf gets overwritten after every loop pass. Any suggestions?

    Yes, buf will get overwritten with every call to Read().

    A timeout on the file handle would be the approach I would take.

    s, _ := os.OpenFile("/dev/ttyS0", syscall.O_RDWR|syscall.O_NOCTTY|syscall.O_NONBLOCK, 0666)
    
    t := syscall.Termios{
        Iflag:  syscall.IGNPAR,
        Cflag:  syscall.CS8 | syscall.CREAD | syscall.CLOCAL | syscall.B115200,
        Cc:     [32]uint8{syscall.VMIN: 0, syscall.VTIME: uint8(20)}, //2.0s timeout
        Ispeed: syscall.B115200,
        Ospeed: syscall.B115200,
    }
    
    // syscall
    syscall.Syscall6(syscall.SYS_IOCTL, uintptr(s.Fd()),
        uintptr(syscall.TCSETS), uintptr(unsafe.Pointer(&t)),
        0, 0, 0)
    
    // Send message
    n, _ := s.Write([]byte("Test message"))
    
    // Receive reply
    for {
        buf := make([]byte, 128)
        n, err = s.Read(buf)
        if err != nil { // err will equal io.EOF
            break
        }
        fmt.Printf("%v\n", string(buf))
    }
    

    Also note, if there is no more data read and there is no error, os.File.Read() will return an error of io.EOF, as you can see here.

提交回复
热议问题