单片机 + 4G模块7S1上有人云平台自己添加变量进行温度采集,将数据发送有人云平台

目录

前言

一、有人云平台添加设备及变量

二、有人云数据通讯协议: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

( 我尝试把单片机如何添加的过程写下来,篇幅太长了,后面考虑贴一个完整的吧)

二、有人云数据通讯协议:modbus rtu

        单片机要和有人云通讯要解决通讯协议的问题,咨询客服:

       1、首先是单片机接收主机报文

        modbus是严格的主从通讯,只有主机发送了数据,从机才能做出应答,从机是不可以主动向主机发数据的,所以单片机就要首先提取查询指令, 我们通过串口提取到有人云发送的查询报文是:

        这段把报文各数据的意义:第一个八位数据01:从机地址;第二个八位数据03:功能码;第三到六的八位数据是寄存器地址;最后是CRC校验位。数据格式如下图:

      单片机对主机发送的报文进行处理,我的处理方式是:依次判断是否收到01和03,如果是就继续判断收到的是第几个寄存器。

      2、单片机发送modbus rtu报文

       难免有十六位的数据我需要转换成两个八位才能实现modbus的数据交换

/****************************************************************
功  能:十六位的数据转换成两个八位数据
参  数:dec:
返回值:无
*****************************************************************/

uint8_t eight[2];     //hex[0]存放低八位,hex[1]存放高八位

void SixteenToEight(uint16_t sixteen)
{
	eight[0] = (sixteen >>8 ) & 0xff;  //低八位
	eight[1] = sixteen & 0xff;   //高八位
}

        接下来是发送数据:

        数据发送是十六进制的,但是在使用printf打印的时候发现了一个问题,0x00死活发送不出去。这是什么原因我也没有细究,反正网上的办法也是用了很多都没有解决。最后用HAL库自带的发送函数把这串数据发出去了,再简单截取一个我的发送程序:

uint8_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校验位计算程序:

/****************************************************************************************
功  能:计算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模块连上网以后就可以将数据发送到云了,最终显示界面如下图:

  • 11
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 35
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值