|
5 | 5 | using System.IO;
|
6 | 6 | using System.IO.Ports;
|
7 | 7 | using System.Text;
|
| 8 | +using System.Threading; |
8 | 9 |
|
9 | 10 | namespace ModbusDriver
|
10 | 11 | {
|
@@ -209,13 +210,15 @@ public int WriteSingleCoils(int id, int startAddress, bool OnOff)
|
209 | 210 | {
|
210 | 211 | OnError(this, new IOErrorEventArgs(Modbus.GetErrorString(errorcode)));
|
211 | 212 | }
|
| 213 | + Thread.Sleep(10); |
212 | 214 | return -1;
|
213 | 215 | }
|
214 | 216 | else//正确需8字节
|
215 | 217 | {
|
216 | 218 | numBytesRead = 0;
|
217 | 219 | while (numBytesRead < 3)
|
218 | 220 | numBytesRead += _serialPort.Read(frameBytes, numBytesRead, 3 - numBytesRead);
|
| 221 | + Thread.Sleep(10); |
219 | 222 | return 0;
|
220 | 223 | }
|
221 | 224 | }
|
@@ -256,13 +259,15 @@ public int WriteMultipleCoils(int id, int startAddress, ushort numBits, byte[] v
|
256 | 259 | {
|
257 | 260 | OnError(this, new IOErrorEventArgs(Modbus.GetErrorString(errorcode)));
|
258 | 261 | }
|
| 262 | + Thread.Sleep(10); |
259 | 263 | return -1;
|
260 | 264 | }
|
261 | 265 | else//正确需9字节
|
262 | 266 | {
|
263 | 267 | numBytesRead = 0;
|
264 | 268 | while (numBytesRead < 4)
|
265 | 269 | numBytesRead += _serialPort.Read(frameBytes, numBytesRead, 3 - numBytesRead);
|
| 270 | + Thread.Sleep(10); |
266 | 271 | return 0;
|
267 | 272 | }
|
268 | 273 | }
|
@@ -299,13 +304,15 @@ public int WriteSingleRegister(int id, int startAddress, byte[] values)
|
299 | 304 | {
|
300 | 305 | OnError(this, new IOErrorEventArgs(Modbus.GetErrorString(errorcode)));
|
301 | 306 | }
|
| 307 | + Thread.Sleep(10); |
302 | 308 | return -1;
|
303 | 309 | }
|
304 | 310 | else//正确需8字节
|
305 | 311 | {
|
306 | 312 | numBytesRead = 0;
|
307 | 313 | while (numBytesRead < 3)
|
308 | 314 | numBytesRead += _serialPort.Read(frameBytes, numBytesRead, 3 - numBytesRead);
|
| 315 | + Thread.Sleep(10); |
309 | 316 | return 0;
|
310 | 317 | }
|
311 | 318 | }
|
@@ -347,13 +354,15 @@ public int WriteMultipleRegister(int id, int startAddress, byte[] values)
|
347 | 354 | {
|
348 | 355 | OnError(this, new IOErrorEventArgs(Modbus.GetErrorString(errorcode)));
|
349 | 356 | }
|
| 357 | + Thread.Sleep(10); |
350 | 358 | return -1;
|
351 | 359 | }
|
352 | 360 | else//正确需8字节
|
353 | 361 | {
|
354 | 362 | numBytesRead = 0;
|
355 | 363 | while (numBytesRead < 3)
|
356 | 364 | numBytesRead += _serialPort.Read(frameBytes, numBytesRead, 3 - numBytesRead);
|
| 365 | + Thread.Sleep(10); |
357 | 366 | return 0;
|
358 | 367 | }
|
359 | 368 | }
|
@@ -467,19 +476,31 @@ public byte[] ReadBytes(DeviceAddress address, ushort size)
|
467 | 476 | {
|
468 | 477 | byte[] header = func < 3 ? CreateReadHeader(address.Area, address.Start * 16, (ushort)(16 * size), func) :
|
469 | 478 | CreateReadHeader(address.Area, address.Start, size, func);
|
470 |
| - _serialPort.Write(header, 0, header.Length); |
471 |
| - byte[] frameBytes = new byte[size * 2 + 5]; |
472 |
| - byte[] data = new byte[size * 2]; |
473 |
| - int numBytesRead = 0; |
474 | 479 | lock (_async)
|
475 | 480 | {
|
476 |
| - while (numBytesRead != frameBytes.Length) |
477 |
| - numBytesRead += _serialPort.Read(frameBytes, numBytesRead, frameBytes.Length - numBytesRead); |
478 |
| - if (frameBytes[0] == address.Area && Utility.CheckSumCRC(frameBytes)) |
| 481 | + byte[] frameBytes = new byte[size * 2 + 3];//size * 2 + |
| 482 | + byte[] data = new byte[size * 2]; |
| 483 | + _serialPort.Write(header, 0, header.Length); |
| 484 | + int numBytesRead = 0; |
| 485 | + while (numBytesRead < 2) |
| 486 | + numBytesRead += _serialPort.Read(frameBytes, numBytesRead, 2 - numBytesRead); |
| 487 | + if (frameBytes[1] == address.DBNumber) |
479 | 488 | {
|
480 |
| - Array.Copy(frameBytes, 3, data, 0, data.Length); |
| 489 | + numBytesRead = 0; |
| 490 | + while (numBytesRead != frameBytes.Length) |
| 491 | + numBytesRead += _serialPort.Read(frameBytes, numBytesRead, frameBytes.Length - numBytesRead); |
| 492 | + Array.Copy(frameBytes, 1, data, 0, data.Length); |
| 493 | + Thread.Sleep(10); |
481 | 494 | return data;
|
482 | 495 | }
|
| 496 | + else |
| 497 | + { |
| 498 | + numBytesRead = 0; |
| 499 | + while (numBytesRead < 3) |
| 500 | + numBytesRead += _serialPort.Read(frameBytes, numBytesRead, 3 - numBytesRead); |
| 501 | + Thread.Sleep(10); |
| 502 | + } |
| 503 | + |
483 | 504 | }
|
484 | 505 | return null;
|
485 | 506 | }
|
|
0 commit comments