Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fb90bbf207 | |||
| 343292b9b2 | |||
| a635b8af4e | |||
| 7ba768b8c2 | |||
| b45b8e1d8d | |||
| 1df66eccd1 |
@@ -465,7 +465,8 @@ func (rt *rtuTransport) readRTUFrameWithRes() (res *pdu, err error) {
|
|||||||
// 标准modbus响应已读取完成,现在读取自定义数据
|
// 标准modbus响应已读取完成,现在读取自定义数据
|
||||||
// 设置5秒超时来读取自定义数据
|
// 设置5秒超时来读取自定义数据
|
||||||
customDataTimeout := 5 * time.Second
|
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 {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -477,6 +478,16 @@ func (rt *rtuTransport) readRTUFrameWithRes() (res *pdu, err error) {
|
|||||||
var lastErr error // 记录最后一次非超时错误
|
var lastErr error // 记录最后一次非超时错误
|
||||||
|
|
||||||
for {
|
for {
|
||||||
|
// 检查是否已经超时
|
||||||
|
if time.Now().After(deadline) {
|
||||||
|
// 超时时间到,退出循环
|
||||||
|
// 如果有之前记录的错误,使用它;否则err保持为nil(超时是正常的)
|
||||||
|
if lastErr != nil {
|
||||||
|
err = lastErr
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
// 检查缓冲区是否还有空间
|
// 检查缓冲区是否还有空间
|
||||||
if startPos+totalRead+len(tempBuf) > len(rxbuf) {
|
if startPos+totalRead+len(tempBuf) > len(rxbuf) {
|
||||||
// 如果缓冲区不够,扩展它
|
// 如果缓冲区不够,扩展它
|
||||||
@@ -497,7 +508,7 @@ func (rt *rtuTransport) readRTUFrameWithRes() (res *pdu, err error) {
|
|||||||
if readErr != nil {
|
if readErr != nil {
|
||||||
if os.IsTimeout(readErr) {
|
if os.IsTimeout(readErr) {
|
||||||
// 超时时间到,退出循环
|
// 超时时间到,退出循环
|
||||||
// 如果有之前记录的错误,使用它;否则使用超时错误
|
// 如果有之前记录的错误,使用它;否则err保持为nil(超时是正常的)
|
||||||
if lastErr != nil {
|
if lastErr != nil {
|
||||||
err = lastErr
|
err = lastErr
|
||||||
}
|
}
|
||||||
|
|||||||
12
serial.go
12
serial.go
@@ -35,9 +35,12 @@ func (spw *serialPortWrapper) Open() (err error) {
|
|||||||
var parity string
|
var parity string
|
||||||
|
|
||||||
switch spw.conf.Parity {
|
switch spw.conf.Parity {
|
||||||
case PARITY_NONE: parity = "N"
|
case PARITY_NONE:
|
||||||
case PARITY_EVEN: parity = "E"
|
parity = "N"
|
||||||
case PARITY_ODD: parity = "O"
|
case PARITY_EVEN:
|
||||||
|
parity = "E"
|
||||||
|
case PARITY_ODD:
|
||||||
|
parity = "O"
|
||||||
}
|
}
|
||||||
|
|
||||||
spw.port, err = serial.Open(&serial.Config{
|
spw.port, err = serial.Open(&serial.Config{
|
||||||
@@ -46,7 +49,7 @@ func (spw *serialPortWrapper) Open() (err error) {
|
|||||||
DataBits: int(spw.conf.DataBits),
|
DataBits: int(spw.conf.DataBits),
|
||||||
Parity: parity,
|
Parity: parity,
|
||||||
StopBits: int(spw.conf.StopBits),
|
StopBits: int(spw.conf.StopBits),
|
||||||
Timeout: 10 * time.Millisecond,
|
Timeout: 100 * time.Millisecond,
|
||||||
})
|
})
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -69,6 +72,7 @@ func (spw *serialPortWrapper) Close() (err error) {
|
|||||||
// - the serial port's receive buffer is empty: port.Read() blocks for
|
// - the serial port's receive buffer is empty: port.Read() blocks for
|
||||||
// up to 10ms and returns serial.ErrTimeout. The serial timeout error is
|
// up to 10ms and returns serial.ErrTimeout. The serial timeout error is
|
||||||
// masked and Read() returns with no data.
|
// masked and Read() returns with no data.
|
||||||
|
//
|
||||||
// As the higher-level methods use io.ReadFull(), Read() will be called
|
// 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
|
// as many times as necessary until either enough bytes have been read or an
|
||||||
// error is returned (ErrRequestTimedOut or any other i/o error).
|
// error is returned (ErrRequestTimedOut or any other i/o error).
|
||||||
|
|||||||
Reference in New Issue
Block a user