tarm / serial

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Timeout problem with io.Reader

sanchez84 opened this issue · comments

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