485型风速和风向变送器数据包解析
风向变送器有8方位风向和360度风向两种;
外壳分为铝合金和聚碳两种;
风向传感器变速器测量方式分为:模拟量(420mA05V010V)RS485
由于风速和风向变送器是分开的,所以我们选择了RS485总线的测量方式,这样我们将两个模块并到一起,设为不同的地址,这样就可以只占用一个串口资源就可以获取风速和风向的数据了。应用场景
广泛适用于气象、海洋、环境、机场、港口、实验室、工农业及交通等领域的风速和风向测量。数据帧格式定义
采用ModbusRTU通讯规约,格式如下:
初始结构4字节的时间
地址码1字节
功能码1字节
数据区N字节
错误校验16位CRC码
结束结构4字节的时间
地址码:为变送器的地址,在通讯网络中是唯一的(出厂默认0x01)。
功能码:主机所发指令功能指示,本变送器只用到功能码0x03(读取寄存器数据)。
数据区:数据区是具体通讯数据,注意16bits数据高字节在前!
CRC码:二字节的校验码。
注意:此通讯协议只适用于我购买过的那款风速风向仪,不同厂家协议不同。主机问询帧结构:
地址码
功能码
寄存器起始地址
寄存器长度
校验码低位
校验码高位
1字节
1字节
2字节
2字节
1字节
1字节从机应答帧结构:
地址码
功能码
有效字节数
数据一区
第二数据区
第N数据区
校验码
1字节
1字节
1字节
2字节
2字节
2字节
2字节
通讯实例:读取设备地址0x01的风向问询帧:
地址码
功能码
起始地址
数据长度
CRC低位
CRC高位
0x01
0x03
0x000x00
0x000x02
0xC4
0x0B
应答帧:(例如读到风向值(07档)为2,(0360)为90)
地址码
功能码
返回字节数
风向(07档)
风向(0360)
CRC低位
CRC高位
0x01
0x03
0x04
0x000x02
0x000x5A
0xDB
0xC8风向计算:
(07档):0002H(十六进制)2风向东风
(0360):005AH(十六进制)90风向东风读取设备地址0x01的风速值问询帧:
地址码
功能码
起始地址
数据长度
CRC低位
CRC高位
0x01
0x03
0x000x00
0x000x01
0x84
0x0A应答帧:(例如读到当前风速为8。6ms)
地址码
功能码
返回字节数
当前风速值
CRC低位
CRC高位
0x01
0x03
0x02
0x000x56
0x38
0x7A风速计算:
当前风速:0056H(十六进制)86风速8。6ms硬件连接风速和风向变速器12V供电;我们使用一个485接口,将风速和风向变速器并联到了一起。
由于RS485的子设备之间的设备地址不能相同,所以我们将风速仪的地址设为了1,风向仪的地址设为了2。RS485总线参考电路
嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!
无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。
点击这里找小助理0元领取:加微信领取资料
要想获取风速或风向值,我们要经过如下三步操作:(1)发送问询帧:if(times101){times2;if(times2100){求风速sprintf(dtbuf,cccccccc,0x01,0x03,0x00,0x00,0x00,0x01,0x84,0x0A);MAX485DE1;USART2OUT((u8)dtbuf,8);MAX485DE0;}elseif(times2105){求风向sprintf(dtbuf,cccccccc,0x02,0x03,0x00,0x00,0x00,0x02,0xC4,0x38);MAX485DE1;USART2OUT((u8)dtbuf,8);MAX485DE0;}}(2)接收串口数据:u16USART2RXSTA0;voidUSART2IRQHandler(void){u8res;if(USARTGetITStatus(USART2,USARTITRXNE)!RESET){resUSARTReceiveData(USART2);if(USART2RXSTAUSART2MAXRECVLEN){TIMSetCounter(TIM2,0);if(USART2RXSTA0)TIM2Set(1);USART2RXBUF〔USART2RXSTA〕res;}else{USART2RXSTA115;}}}(3)解析数据帧:解析RS485信息if(USART2RXSTA0x8000){uart2LenUSART2RXSTA0x3f;if(uart2Len7){nCRC16crc16(USART2RXBUF,5);checkBitHig(nCRC168)0xFF;checkBitLownCRC160xFF;if(checkBitHigUSART2RXBUF〔5〕checkBitLowUSART2RXBUF〔6〕){printf(收到风速数据包r);u16ValueUSART2RXBUF〔3〕256USART2RXBUF〔4〕;stuAliOSIoT。WindSpeedu16Value10。0;}}elseif(uart2Len9){nCRC16crc16(USART2RXBUF,7);checkBitHig(nCRC168)0xFF;checkBitLownCRC160xFF;if(checkBitHigUSART2RXBUF〔7〕checkBitLowUSART2RXBUF〔8〕){printf(收到风向数据包r);stuAliOSIoT。WindDirectionUSART2RXBUF〔4〕;}}USART2RXSTA0;memset(USART2RXBUF,0,sizeof(USART2RXBUF));}
上面函数返回的数据帧,首先要对返回的数据进行CRC校验,只有合法的数据帧我们才会对数据帧进行解析,防止出现脏包。
文章链接:
https:mp。weixin。qq。comsHxmNOIvTEwLR4JVBzf5LoA
转载自:嵌入式从0到1,作者程序员XiaoHa
文章链接:485型风速和风向变送器数据包解析