宇电的设备使用基于RS-485的自定义协议,协议本身比较简单,只有2条指令:

读:地址代号+52H(82) +要读的参数代号+0+0+校验码

写:地址代号+43H(67)+要写的参数代号+写入数低字节+写入数高字节+校验码

校验码采用 16 位求和校验方式,其中读指令的校验码计算方法为:要读参数的代号×256+82+ADDR。

写指令的校验码计算方法为以下公式做 16 位二进制加法计算得出的余数(溢出部分不处理):要写的参数代号×256+67+要写的参数值+ADDR。

返回的数据格式更是固定的,无论是读还是写,仪表都返回以下10个字节数据:测量值 PV+给定值 SV+输出值 MV 及报警状态+所读/写参数值+校验码。

其中 PV、 SV 及所读参数值均各占 2 个字节,代表一个 16 位二进制有符号补码整数,低位字节在前,高位字节在后,整数无法表示小数点,要求用户在上位机处理; MV 占一个字节,按 8 位有符号二进制数格式,数值范围-110~+110,状态位占一个字节,校验码占 2 个字节,共 10 个字节。

而返回的校验码计算则是:PV+SV+(报警状态*256+MV)+参数值+ADDR。清楚协议的这些规则后,编写程序只是顺理成章的事。直接上代码:

/*读取目标设备的参数值*/
void ReadAiBusDeviceParameter(uint8_t deviceAddr,uint8_t paraAddr,void (*AiBusSendByte)(uint8_t *,uint16_t))
{uint8_t readCommand[INSTRUCTION_LENGTH];uint16_t index=0;readCommand[index++]=0x80+deviceAddr;readCommand[index++]=0x80+deviceAddr;readCommand[index++]=READ_INSTRUCTION;readCommand[index++]=paraAddr;readCommand[index++]=0x0;readCommand[index++]=0x0;uint16_t checkSum=(uint16_t)paraAddr*256+READ_INSTRUCTION+(uint16_t)deviceAddr;readCommand[index++]=checkSum;readCommand[index++]=(checkSum>>8);AiBusSendByte(readCommand,INSTRUCTION_LENGTH);
}/*设置目标设备的参数值*/
void WriteAiBusDeviceParameter(uint8_t deviceAddr,uint8_t paraAddr,uint16_t data,void (*AiBusSendByte)(uint8_t *,uint16_t))
{uint8_t writeCommand[INSTRUCTION_LENGTH];uint16_t index=0;writeCommand[index++]=0x80+deviceAddr;writeCommand[index++]=0x80+deviceAddr;writeCommand[index++]=WRITE_INSTRUCTION;writeCommand[index++]=paraAddr;writeCommand[index++]=data;writeCommand[index++]=(data>>8);uint16_t checkSum=(uint16_t)paraAddr*256+WRITE_INSTRUCTION+(uint16_t)deviceAddr+data;writeCommand[index++]=checkSum;writeCommand[index++]=(checkSum>>8);AiBusSendByte(writeCommand,INSTRUCTION_LENGTH);
}/*解析返回数据,返回值为读或者写的参数值*/
int ParsingReturnData(uint8_t *receiveData,uint16_t *returnData,uint8_t *deviceAddr,uint16_t deviceNum)
{int status=-1;uint16_t pValue=0;uint16_t sValue=0;uint16_t mValue=0;uint16_t alarmStatus=0;uint16_t paraValue=0;uint16_t checkSum=0;pValue=receiveData[0]+receiveData[1]*256;sValue=receiveData[2]+receiveData[3]*256;mValue=(uint16_t)receiveData[4];alarmStatus=(uint16_t)receiveData[5];paraValue=receiveData[6]+receiveData[7]*256;checkSum=receiveData[8]+receiveData[9]*256;uint16_t chk=pValue+sValue+alarmStatus*256+mValue+paraValue;for(int i=0;i<deviceNum;i++){if(checkSum==chk+deviceAddr[i]){status=i;returnData[0]=pValue;returnData[1]=sValue;returnData[2]=mValue;returnData[3]=alarmStatus;returnData[4]=paraValue;break;}}return status;
}

欢迎关注:

STM32与宇电设备实现AI-BUS通讯相关推荐

  1. STM32与Futaba遥控器进行S.Bus的通讯程序

    Futaba(日本双叶电子工业,戏称"扶他爸")的遥控器用航模中使用较为广泛的遥控器.S.Bus则是Futaba公司提出的舵机控制总线.本篇博文主要以T6K为对象,介绍STM32与 ...

  2. STM32驱动W5100S网口模块实现UDP通讯

    本文博客链接:https://blog.csdn.net/zsj2016o/article/details/88883863 作者:zsj ,转载请注明. STM32驱动W5100S网口模块实现UDP ...

  3. STM32应用实例七:与宇电设备实现AI-BUS通讯

    宇电的设备使用基于RS-485的自定义协议,协议本身比较简单,只有2条指令: 读:地址代号+52H(82) +要读的参数代号+0+0+校验码 写:地址代号+43H(67)+要写的参数代号+写入数低字节 ...

  4. STM32与多台MS5803压力传感器I2C通讯

    MS5803压力传感器支持SPI和I2C总线通讯,拥有24位AD转换.能够同时获得压力值和温度值,其中压力测量范围为10-1100mbar,温度的测量范围是-40-85摄氏度.各引脚功能及参数如下: ...

  5. Stratifyd创始人汪晓宇:打造AI数据分析生态 | 亿欧专访

    人工智能发展至今已历经三次浪潮,身处第三次浪潮的今天,人们已经感知到AI对于生活方方面面的影响. 智能家居.智能机器人.指纹识别.人脸识别等等,都是AI在日常生活中的应用体现.人工智能正以不可逆转的迅 ...

  6. 《STM32从零开始学习历程》——USART串口通讯实验篇1——中断接收与发送

    <STM32从零开始学习历程>@EnzoReventon USART串口通讯实验篇1--中断接收与发送 最近开始接触了STM32F4xx系列单片机,对于我这个从零开始学习的小白来说,可谓困 ...

  7. 《STM32从零开始学习历程》——USART串口通讯实验篇2——指令控制LED灯实验

    <STM32从零开始学习历程>@EnzoReventon USART串口通讯实验篇2--指令控制LED灯实验 本实验是在<USART串口通讯实验篇1--中断接收与发送>的基础上 ...

  8. AI赋能通讯,探索企业服务新价值——容联通讯云中国行首站在京举行

    4月25日,中国最大的企业通讯云--容联,在北京举办了"云﹡智能﹡连接--通讯云中国行"首站活动.来自金融.互联网.汽车.军工.能源.制造.医疗等领域的百余名嘉宾莅临现场,共议云. ...

  9. STM32学习笔记(5) 串口通讯-接收与发送

    一 通信的基本概念 串口并行与串行 数电课讲过,并行速度快但占用的门电路多,耗费空间 串行速度慢但节约空间 数据通信方向 全双工:TX,RX同时收发数据 半双工:不能同时收发数据,可分时收发数据 单工 ...

最新文章

  1. idea搭建javaweb项目 Artifacts生成
  2. 测试类图Head First 设计模式 (九) 迭代器与组合模式(Iterator Composite pattern) C++实现...
  3. 使用Topshelf管理Windows服务
  4. 在用v-for时又想用v-if进行判断是否生产内容
  5. 2018-06-18
  6. ubuntu 打不开商店怎么办
  7. EC600 QuecPython接入第三方MQTT服务器, 以阿里云物联网平台为例,可替换为自己创建的MQTT服务器
  8. 华为防火墙网管配置实例
  9. stm32之SPI通信学习分析附源码
  10. 分类与聚类的区别以及聚类的方法分类
  11. debug断点调试进不去
  12. 6v电源控制12v继电器
  13. 加拿大海运专线操作流程详解
  14. 代码库_单精度浮点减法器
  15. 量子计算机1003无标题,量子计算机研究
  16. ubuntu18.04下拨号上网pppoe存在多个pppd进程导致频繁断网
  17. 微软服务器安装显卡驱动,适用于 Windows 的 Azure N 系列 NVIDIA GPU 驱动程序安装 - Azure Virtual Machines | Microsoft Docs...
  18. Qt编写地图综合应用57-跨平台(win、linux、mac、uos、kylin等)
  19. 用js获取某一年一共多少天和剩余天数
  20. 【猜牌算法】魔术师的游戏

热门文章

  1. LSTM(序列标注,自实现)
  2. 国科大高级人工智能笔记1-搜索
  3. Java缓存框架使用EhCache结合Spring AOP
  4. [转载] 一致性哈希
  5. 唯一索引与主键索引的比较
  6. 360WIFI 2 树莓派 上网-- 失败
  7. HDU 4431 Mahjong(模拟题)
  8. vue学习笔记-01-前端的发展历史(从后端到前端,再到前后端分离,再到全栈)
  9. SpringBoot笔记整理(三)
  10. 计算机网络(十)-数据链路层-差错控制