1, 简单方法实现四舍五入
实际项目中,经常会出现需要四舍五入的地方,比如采集温度temp,如果直接把float类型保存为小数点后1位。它会直接舍后面多余的位数,这样可能偏差会比较大。
我们可以通过+0.5来实现四舍五入。
比如:
float temp = 30.6;
//假设我们是扩大10倍保存
//直接保存
uint16_t modbus_data.temp = temp * 10; //结果就是30
//+0.5
uint16_t modbus_data.temp = (temp+0.5) * 10; //结果就是31
保存小数点后2位置,那就加0.05,其他都是类似的。
2,继电器的状态:“开”和“关”容易产生误解
之前做的一个项目,上位机和下位机通过Modbus RTU进行通信。为了方便项目经理现场调试,我把相应的串口指令整理出来以文档的形式发给了他,如下:
(1)第1路开:01 06 00 01 00 01 19 CA
第1路关:01 06 00 01 00 00 D8 0A
(2)第2路开:01 06 00 02 00 01 E9 CA
第2路关: 01 06 00 02 00 00 28 0A
问题来了,他在现场调试的时候,说不对啊,你给我这通信协议怎么是反的? 我看了看,没错呀,开是01,关是00。开表示继电器闭合,关表示继电器断开。
他当时就无语了,原来是搞了个乌龙,他以为开表示开路。
因为中文的开,既有“开路”的意思,也有“打开、接通”的意思,所以就很容易产生歧义。
怎么解决呢?
也很简单,以后再写继电器开、关时,加个英文的ON、OFF就可以了。比如:
(1)第1路开(ON):01 06 00 01 00 01 19 CA
第1路关(OFF):01 06 00 01 00 00 D8 0A
(2)第2路开(ON):01 06 00 02 00 01 E9 CA
第2路关(OFF): 01 06 00 02 00 00 28 0A
虽然是小问题,但的的确确影响了工作效率,增加了沟通成本。
2,两台电脑通过网线直连,用网络工具发送数据。(ip、端口配置)
(1)我平常的使用形式是:
电脑A、电脑B、wifi模块
wifi模块作为服务端,电脑A、B作为客户端,通过wifi模块在中间转发实现A和B的通信。
这种情况下,wifi模块的端口是确定的,即A、B的目标端口是确定的,直接输入即可。
(2)有同事问我,如果我要两台电脑直接通过网线连接,网络助手中该如何设置ip、端口?
这还真是有点小技巧:(端口号从何而来呢?)
电脑A:服务端(侦听)
电脑B:客户端
① A和B处在同一个网段
② B的目标IP:A的IP,B的目标端口:A的端口(即:两个电脑直接连接时,端口号保持一致即可)
注:客户端可以发数据给服务端,服务端只能接收数据。
如果想要A和B互相收发数据,就需要找一个公共的服务端,A和B都作为客户端。
A(客户端)-- 服务端 -- B(客户端),服务端起到接收消息、转发消息的作用