概述
目录
前言
一、有人云平台添加设备及变量
二、有人云数据通讯协议: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协议是十六进制的,首要解决的就是将十进制的值转换成十六进制,我贴一个自己写的程序:
/****************************************************************
功
能:十进制转换十六进制
参
数: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库自带的发送函数把这串数据发出去了,再简单截取一个我的发送程序:
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模块连上网以后就可以将数据发送到云了,最终显示界面如下图:
最后
以上就是激昂咖啡为你收集整理的单片机 + 4G模块7S1上有人云平台自己添加变量进行温度采集,将数据发送有人云平台前言一、有人云平台添加设备及变量二、有人云数据通讯协议:modbus rtu总结的全部内容,希望文章能够帮你解决单片机 + 4G模块7S1上有人云平台自己添加变量进行温度采集,将数据发送有人云平台前言一、有人云平台添加设备及变量二、有人云数据通讯协议:modbus rtu总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复