目录
前言
一、有人云平台添加设备及变量
二、有人云数据通讯协议:modbus rtu
1、首先是单片机接收主机报文
2、单片机发送modbus rtu报文,将十进制数据转换十六进制
总结
前言
想记录一些我在工作和学习过程中遇到的问题
4g模块:WH - LTE - 7S1
单片机型号:STM32G030C8T6
目的:单片机将测得的温度数据通过4g模块,上传至有人的云平台
一、有人云平台添加设备及变量
使用单片机不同的就是WH - LTE - 7S1的指令需要单片机通过串口发送,硬件上单片机与7S1串口连接。
添加设备有人云说明书和教学视频都有,可以进入官网,WH - LTE - 7S1这个模块只能支持ID方式添加:这里我贴一个连接http://cloud.usr.cn/document/295.html,每个模块如何添加都可以找到。
接下来是添加变量:http://cloud.usr.cn/document/322.html
( 我尝试把单片机如何添加的过程写下来,篇幅太长了,如果有人看到这篇文章,想了解单片机如何通过4g模块上云,可以加我qq903943908,一起讨论)
二、有人云数据通讯协议:modbus rtu
单片机要和有人云通讯要解决通讯协议的问题,咨询客服:
1、首先是单片机接收主机报文
modbus是严格的主从通讯,只有主机发送了数据,从机才能做出应答,从机是不可以主动向主机发数据的,所以单片机就要首先提取查询指令, 我们通过串口提取到有人云发送的查询报文是:
这段把报文各数据的意义:第一个八位数据01:从机地址;第二个八位数据03:功能码;第三到六的八位数据是寄存器地址;最后是CRC校验位。数据格式如下图:
单片机对主机发送的报文进行处理,我的处理方式是:依次判断是否收到01和03,如果是就继续判断收到的是第几个寄存器。
2、单片机发送modbus rtu报文,将十进制数据转换十六进制
因为我需要发送的数据是温度值,而我的数据是十进制的,modbus协议是十六进制的,首要解决的就是将十进制的值转换成十六进制,我贴一个自己写的程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16/**************************************************************** 功 能:十进制转换十六进制 参 数:dec:十进制数 返回值:无 *****************************************************************/ uint8_t hex[2]; //存放十进制转换成十六进制的数组,hex[0]存放低八位,hex[1]存放高八位 void Dechex(uint16_t dec) { hex[0] = (dec >>8 ) & 0xff; //低八位 hex[1] = dec & 0xff; //高八位 }
接下来是发送数据:
数据发送是十六进制的,但是在使用printf打印的时候发现了一个问题,0x00死活发送不出去。这是什么原因我也没有细究,反正网上的办法也是用了很多都没有解决。最后用HAL库自带的发送函数把这串数据发出去了,再简单截取一个我的发送程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14uint8_t buffer[7]; buffer[0] = 0x01; buffer[1] = 0x03; buffer[2] = 0x02; buffer[3] = hex[0]; buffer[4] = hex[1]; buffer[5] = CRC_L; //CRC_L CRC的低八位 buffer[6] = CRC_H; //CRC_H CRC的低高位 HAL_UART_Transmit(&huart2,(uint8_t*)buffer,7,50); //串口2向7S1模块发送数据
接下来是报文的CRC校验位,因为之前对modbus的了解不是很深入,所以也去搜了很多资料得到这样一句话:
Modbus RTU采用16位的循环冗余校验码(CRC)。通过一个对数据进行“或”运算以及移位运算的复杂程序,由主设备产生CRC,并且由接收设备进行检查。如果双方计算出的CRC值不符,从设备就会要求重新传送信息。
所以我们需要计算CRC的值,再贴一个CRC校验位计算程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51/**************************************************************************************** 功 能:计算CRC校验位的值 参 数:1:*buffer:数据的第一个字节 2:len:数据长度 返回值:CRC校验值 ****************************************************************************************/ static unsigned char CRC_L,CRC_H; unsigned short GetCRCData(unsigned char *buffer,unsigned len) { unsigned short wcrc = 0xFFFF; //16位CRC寄存器预置 unsigned char temp; unsigned i = 0, j = 0; //计数 for (i = 0; i < len; i++) //循环计算每个数据 { temp = *buffer & 0x00FF; //将八位数据与crc寄存器亦或 buffer++; //指针地址增加,指向下个数据 wcrc ^= temp; //将数据存入crc寄存器 for (j = 0; j < 8; j++) //循环计算数据的 { if (wcrc & 0x0001) //判断右移出的是不是1,如果是1则与多项式进行异或。 { wcrc >>= 1; //先将数据右移一位 wcrc ^= 0xA001; //与上面的多项式进行异或 } else //如果不是1,则直接移除 { wcrc >>= 1; //直接移除 } } } //定义数据高低位 CRC_L = wcrc & 0xFF; //CRC的低8位 CRC_H = wcrc >> 8; //CRC的高8位 return((CRC_L << 8) | CRC_H); }
总结
这个方案中单片机连上云是采用的4G模块做中转,单片机通过串口和4G模块进行通讯。4G模块连上网以后就可以将数据发送到云了,最终显示界面如下图:
最后
以上就是激昂咖啡最近收集整理的关于单片机 + 4G模块7S1上有人云平台自己添加变量进行温度采集,将数据发送有人云平台前言一、有人云平台添加设备及变量二、有人云数据通讯协议:modbus rtu总结的全部内容,更多相关单片机内容请搜索靠谱客的其他文章。
发表评论 取消回复