tarm / serial

BSD 3-Clause "New" or "Revised" License
1.6k stars 451 forks source link

Timeout problem with io.Reader #116

Open sanchez84 opened 3 years ago

sanchez84 commented 3 years ago

if I use:

portCfg := &serial.Config{Name: "COM1", Baud: 115200, ReadTimeout: 1 * time.Second}
port, err := serial.OpenPort(portCfg)
portReader = bufio.NewReader(port)
n, err := io.ReadFull(portReader, buf)

timeout doesn't happen. Function serial.Read() returned 0 bytes and error==nil and io.ReadFull() continue to work. Maybe serial.Read() must return io.EOF if timeout happen? For this, function getOverlappedResult() maybe like this:

func getOverlappedResult(h syscall.Handle, overlapped *syscall.Overlapped) (int, error) {
    var n int
    _, _, err := syscall.Syscall6(nGetOverlappedResult, 4, // r, _, err := syscall.Syscall6(nGetOverlappedResult, 4,
        uintptr(h),
        uintptr(unsafe.Pointer(overlapped)),
        uintptr(unsafe.Pointer(&n)), 1, 0, 0)
    // if r == 0 {  // old if
    //  return n, err
    // }
    if err == 1460 { // new if, 1460 - ERROR_TIMEOUT
        return n, io.EOF
    }
    if err != 0 {
        return n, err
    }
    return n, nil
}

Please, fix timeout, thanks