6 Commits

2 changed files with 42 additions and 27 deletions

View File

@@ -465,7 +465,8 @@ func (rt *rtuTransport) readRTUFrameWithRes() (res *pdu, err error) {
// 标准modbus响应已读取完成现在读取自定义数据
// 设置5秒超时来读取自定义数据
customDataTimeout := 5 * time.Second
err = rt.link.SetDeadline(time.Now().Add(customDataTimeout))
deadline := time.Now().Add(customDataTimeout)
err = rt.link.SetDeadline(deadline)
if err != nil {
return
}
@@ -477,6 +478,16 @@ func (rt *rtuTransport) readRTUFrameWithRes() (res *pdu, err error) {
var lastErr error // 记录最后一次非超时错误
for {
// 检查是否已经超时
if time.Now().After(deadline) {
// 超时时间到,退出循环
// 如果有之前记录的错误使用它否则err保持为nil超时是正常的
if lastErr != nil {
err = lastErr
}
break
}
// 检查缓冲区是否还有空间
if startPos+totalRead+len(tempBuf) > len(rxbuf) {
// 如果缓冲区不够,扩展它
@@ -497,7 +508,7 @@ func (rt *rtuTransport) readRTUFrameWithRes() (res *pdu, err error) {
if readErr != nil {
if os.IsTimeout(readErr) {
// 超时时间到,退出循环
// 如果有之前记录的错误,使用它;否则使用超时错误
// 如果有之前记录的错误,使用它;否则err保持为nil超时是正常的
if lastErr != nil {
err = lastErr
}

View File

@@ -35,9 +35,12 @@ func (spw *serialPortWrapper) Open() (err error) {
var parity string
switch spw.conf.Parity {
case PARITY_NONE: parity = "N"
case PARITY_EVEN: parity = "E"
case PARITY_ODD: parity = "O"
case PARITY_NONE:
parity = "N"
case PARITY_EVEN:
parity = "E"
case PARITY_ODD:
parity = "O"
}
spw.port, err = serial.Open(&serial.Config{
@@ -46,7 +49,7 @@ func (spw *serialPortWrapper) Open() (err error) {
DataBits: int(spw.conf.DataBits),
Parity: parity,
StopBits: int(spw.conf.StopBits),
Timeout: 10 * time.Millisecond,
Timeout: 100 * time.Millisecond,
})
return
@@ -69,6 +72,7 @@ func (spw *serialPortWrapper) Close() (err error) {
// - the serial port's receive buffer is empty: port.Read() blocks for
// up to 10ms and returns serial.ErrTimeout. The serial timeout error is
// masked and Read() returns with no data.
//
// As the higher-level methods use io.ReadFull(), Read() will be called
// as many times as necessary until either enough bytes have been read or an
// error is returned (ErrRequestTimedOut or any other i/o error).