request.Add(ModbusAddress);
request.Add(3);
request.Add(0);
request.Add(0);
request.Add(0); //添加通信协议地址包
byte length=(byte)(new BaseModel.Meteorological().MeteorologicalChannel.Max() + 1);
request.Add(length); //Modbus协议规定占两个字节并且通道以最大值为准,最后加一个长度;
request = ModbusCrc.BoxData(request); //校验打包
List<byte> response= Send(request, length);//发送数据包,然后接受数据存储在response应答里面;
if (response.Count == length && ModbusCrc.CheckCRC(response))//应答数据打包验证;
{for (int i = 0; i < xxxxx.Length; i++)
{
Int16 v =response[3+m.MeteorologicalChannel[i]*2];
v <<= 8;
v += response[4 + m.MeteorologicalChannel[i] * 2];
m.Value[i] =(float) (v/Math.Pow(10,m.MeteorologicalPoint[i]));
}
AddTable(m);
CurrentMeteorological = m;
}
if (lastSaveDateTime.Minute != DateTime.Now.Minute && table.Rows.Count > 10)
{
lastSaveDateTime = DateTime.Now;
Save();
}
static List<byte> Send(List<byte> request,int responseLength)//推送
{
List<byte> result = new List<byte>();
try
{
PortIsOpen = false;//用于断开打卡判断;
using (SerialPort port = new SerialPort("COM3", 9600))//new一个串口并写入定义波特率;
{
port.WriteTimeout = 500;//延迟
port.ReadTimeout = 500;
port.Open();//串口要打开
PortIsOpen = true;
port.Write(request.ToArray(), 0, request.Count);//端口写入数据;
while (request.Count < responseLength)
{
byte bye = (byte)port.ReadByte();//每次读取一个byte数据;
result.Add(bye);
}
readFalse = 0;
return result;
}
}
catch
{
readFalse++;
return new List<byte>();
}
}