温湿度设备是S200HT型号,基于RS-485通信接口,报文格式如下:
发送例文:01 03 00 03 00 24 34 0b
接受例文:01 03 04 01 3b 02 d3 ca ff
温度值计算:0x013b/10=315/10=31.5(℃);
湿度值计算:0x02d3/10=723/10=72.3%.
思路:使用.net的串口进行开发,但是在这之前使用google进行查询是否有现成的代码或者类库。
使用.net串口进行开发,模拟相应的发送报文,在标签为2的时候可以成功发送,并接受到相应的报文,但是按照计算,结果不正确。
使用NModbus类库,进行多次测试和应用,结果正确。
总结:第一,遇到问题的首要是不要慌张,告诉自己一定能解决,结果就是能解决的。第二,多使用类库或者别人的经验,这样做的原因主要能快速解决问题,当然如果是学习,可以自己来写,但是工作呢还是快速结束为好,毕竟公司需要你多产出。第三,多思考,结合整体来进行思考。报文的传输,二进制数据传输,如何解析等等。第四,做项目并不是所有的问题都要解决才开始动手,先将大致的框架搭好,然后逐步解决程序中的各个问题,遇到花1-2小时不能解决或者解决无望的情况下,赶紧跳过,进行下一个功能点的开发,将最复杂的放到后面,这样进度就不会受到影响。
以下是核心代码:
using (SerialPort serialPort = new SerialPort())
{
serialPort.PortName = "COM1";
serialPort.BaudRate = 9600;
//以下配置不需要进行手工配置 遵守 RS-485通信协议
serialPort.Parity = Parity.None;
serialPort.StopBits = StopBits.One;
serialPort.DataBits = 8;
serialPort.Open();
// create Modbus RTU Master by the comport client
//document->Modbus.Device.Namespace->ModbusSerialMaster Class->CreateRtu Method
ModbusSerialMaster master = ModbusSerialMaster.CreateRtu(serialPort);
// read the input register 0~9 (30001~300010) of the device slave ID 1
//document->Modbus.Device.Namespace->ModbusMaster Class->ReadInputRegisters Method
byte slaveID = 1;//标签ID
//开始地址为0
ushort startAddress = 0;
ushort numOfPoints = 9;
master.Transport.ReadTimeout = 300;
try
{
ushort[] register = master.ReadHoldingRegisters(slaveID, startAddress, numOfPoints);
float temperatureValue = Convert.ToSingle(register[3]) / 10;
float humidityValue = Convert.ToSingle(register[4]) / 10;