public double ReadRegRTU2(byte slaveAddress, long Address, int nTimeout = 1000) { try { Byte[] recvBytes = new Byte[1024]; int recvSize = 0; byte[] CMD = new byte[8]; CMD[0] = slaveAddress; CMD[1] = 0X03; CMD[2] = (byte)((Address & 0X00FF00) >> 8); CMD[3] = (byte)((Address & 0X00FF) >> 0); CMD[4] = 0; CMD[5] = 0X02; int VALCRC = ParityType.CRC16(CMD, 6); CMD[6] = (byte)(VALCRC & 0X00FF); CMD[7] = (byte)((VALCRC & 0XFF00) >> 8); _serialPort.DiscardInBuffer(); _serialPort.Write(CMD, 0, CMD.Length); Stopwatch stopwatch = new Stopwatch(); stopwatch.Restart(); int data = 0; do { if (stopwatch.ElapsedMilliseconds > nTimeout) { return(double.NaN); } try { Byte d = (Byte)_serialPort.ReadByte(); recvBytes[recvSize++] = d; } catch (Exception ex) { continue; } if (recvSize >= 2 && recvBytes[1] == 0x02) { return(double.NaN); } if (recvSize >= 9 && recvBytes[1] == 0x03) { data |= recvBytes[3] << 24; data |= recvBytes[4] << 16; data |= recvBytes[5] << 8; data |= recvBytes[6]; return(data); } }while (true); } catch (Exception e) { MessageBox.Show("电抓 串口 读取数据异常 " + e.Message, "Err", MessageBoxButtons.OK, MessageBoxIcon.Error); return(double.NaN); } }
public void WriteRegRTU(byte slaveAddress, long Address, int val) { try { byte[] CMD = new byte[8]; CMD[0] = slaveAddress; CMD[1] = 0X06; CMD[2] = (byte)((Address & 0X00FF00) >> 8); CMD[3] = (byte)((Address & 0X00FF) >> 0); CMD[4] = (byte)((val & 0X00FF00) >> 8); CMD[5] = (byte)((val & 0X00FF) >> 0); int VALCRC = ParityType.CRC16(CMD, 6); CMD[6] = (byte)(VALCRC & 0X00FF); CMD[7] = (byte)((VALCRC & 0XFF00) >> 8); _serialPort.DiscardInBuffer(); _serialPort.Write(CMD, 0, CMD.Length); } catch (Exception e) { MessageBox.Show("电抓 串口 写入数据异常 " + e.Message, "Err", MessageBoxButtons.OK, MessageBoxIcon.Error); } }