如题:

CRC计算参考了这篇文章. https://blog.csdn.net/dzahzhcz/article/details/103759813
后来发现在读取的时候会出问题, 所以引入了. serial


import struct
import platform
import time
import serial #导入模块sysstr = platform.system()#RS485文件的通信地址,在开发板上是/dev/ttysWK0
if(sysstr=="Windows"):RS485FileName = "COM1"
elif(sysstr =="Linux"):RS485FileName = "/dev/ttysWK0"# RS485:/dev/ttysWK0# RS232:/dev/ttysWK1# UART2:/dev/ttysWK3# UART1:/dev/ttysWK2
else:RS485FileName = "/dev/ttysWK0"# ===============================================================
def CalCRC16(data, length):#print(data, length)                          #打印数据,长度crc=0xFFFFif length == 0:length = 1j = 0while length != 0:crc ^= list.__getitem__(data, j)#print('j=0x%02x, length=0x%02x, crc=0x%04x' %(j,length,crc))for i in range(0,8):if crc & 1:crc >>= 1crc ^= 0xA001else:crc >>= 1length -= 1j += 1return crc
# ===============================================================
def CRCBuffer(buffer):     crc_transformation = CalCRC16(buffer,len(buffer))    #crc_calculation = hex(crc_transformation)#print('crc_calculation:',crc_calculation)tasd = [0x00,0x00]tasd[0] = crc_transformation & 0xFFtasd[1] = (crc_transformation >> 8) & 0xFFH =hex(tasd[0])L =hex(tasd[1])H_value = int(H,16)L_value = int(L,16)buffer.append(H_value)buffer.append(L_value)return buffer
# ===============================================================# if __name__ == '__main__':#     print(CRCBuffer(buffer))
# ————————————————
# 版权声明:本文为CSDN博主「电子爱好者.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
# 原文链接:https://blog.csdn.net/dzahzhcz/article/details/103759813def Send485CMD_OLD(cmd): global RS485FileName   with open(RS485FileName, "wb") as rs485:  buffercrc = CRCBuffer(cmd)   ret = rs485.write(bytes(buffercrc))rs485.close()return retdef SendAndRead485CMD(cmd):global RS485FileName   ser = serial.Serial(RS485FileName,9600,timeout=10)buffercrc = CRCBuffer(cmd)print("RS485 TX =>", bytes(bytearray(buffercrc)))ser.write(buffercrc) # 这里直接发送int类型的数据, 内部会自动转换成byte字节.# ret = ser.write(bytes(buffercrc))  time.sleep(0.2)res = ser.read_all()print("RS485 RX =>", res)ser.close()return resdef ReadGateSate(gatenum):cmd = [ gatenum, #设备地址='\x00'# 0x00 is guang bo0x03, #功能码='\x06' #\06 is write, \03 is read, \10 is write mutil 0x00, #寄存器地址高='\x00'0x18, #寄存器地址低='\x0E' #0E is open door cmd0x00, #数据高='\x00'0x01, #数据低='\x01' # 0x00, #CRC高='\x00'# 0x00, #CRC低='\x00']return SendAndRead485CMD(cmd)def OpenTheDoor(gatenum):cmd = [ gatenum, #设备地址='\x00'# 0x00 is guang bo0x06, #功能码='\x06' #\06 is write, \03 is read, \10 is write mutil 0x00, #寄存器地址高='\x00'0x0E, #寄存器地址低='\x0E' #0E is open door cmd0x00, #数据高='\x00'0x01, #数据低='\x01' # 0x00, #CRC高='\x00'# 0x00, #CRC低='\x00'] SendAndRead485CMD(cmd);   passdef CloseTheDoor(gatenum):cmd = [ gatenum, #设备地址='\x00'# 0x00 is guang bo0x06, #功能码='\x06' #\06 is write, \03 is read, \10 is write mutil 0x00, #寄存器地址高='\x00'0x0E, #寄存器地址低='\x0E' #0E is open door cmd0x00, #数据高='\x00'0xFF, #数据低='\x01' # 0x00, #CRC高='\x00'# 0x00, #CRC低='\x00'] SendAndRead485CMD(cmd);   passdef OpenTheLid(gatenum):  cmd = [ gatenum, #设备地址='\x00'# 0x00 is guang bo0x06, #功能码='\x06' #\06 is write, \03 is read, \10 is write mutil 0x00, #寄存器地址高='\x00'0x0E, #寄存器地址低='\x0E' #0E is open door cmd0x00, #数据高='\x00'0x01, #数据低='\x01' # 0x00, #CRC高='\x00'# 0x00, #CRC低='\x00'] SendAndRead485CMD(cmd)passdef CloseTheLid(gatenum):cmd = [ gatenum, #设备地址='\x00'# 0x00 is guang bo0x06, #功能码='\x06' #\06 is write, \03 is read, \10 is write mutil 0x00, #寄存器地址高='\x00'0x0E, #寄存器地址低='\x0E' #0E is open door cmd0x00, #数据高='\x00'0xFF, #数据低='\x01' # 0x00, #CRC高='\x00'# 0x00, #CRC低='\x00'] SendAndRead485CMD(cmd);   passres = OpenTheDoor(0x04)
res = ReadGateSate(0x04)

python linux 上 RS485通信 Modbus协议相关推荐

  1. STM32物联网项目-RS485通信(Modbus协议)

    RS485通信(Modbus协议) 协议介绍 RS485介绍:http://t.csdn.cn/bOuFX Modbus协议:http://t.csdn.cn/mgioX CubeMX配置 RS-48 ...

  2. RS485接口modbus协议RTU方式

    文章目录 RS485接口modbus协议RTU方式 一.RS485接口 二.Modbus通信协议 1.1 通信协议 1.2 通信方向 1.3 主从模式和寻址帧格式 1.4 modbus的主机寻址帧格式 ...

  3. python linux上屏幕截图_在Linux上通过Python脚本拍摄屏幕截图

    我想通过python脚本截取屏幕截图,并毫不干扰地保存它. 我只对Linux解决方案感兴趣,应该支持任何基于X的环境. 任何原因您不能使用scrot? 很想检查以下建议方法的性能. 新链接:manpa ...

  4. Linux上nginx配置SSL协议非80、443端口自动跳往https端口

    在生产环境中往往碰到一个网站需要多个访问端口,而默认的http访问端口是80,https访问的端口是443,然而这是不够在生产环境下使用的,这个时候就需要配置更多的端口来弥补这一缺点. 默认情况下用户 ...

  5. python语言编写的modbus协议_基于Python的ModbusTCP客户端实现

    Modbus协议是由Modicon公司(现在的施耐德电气Schneider Electric)推出,主要建立在物理串口.以太网TCP/IP层之上,目前已经成为工业领域通信协议的业界标准,广泛应用在工业 ...

  6. Modbus 协议详解

    Modbus 协议详解 通信协议是指双方实体完成通信或服务所必须遵循的规则和约定,例如我们为实现人与人之间的交流需要约定统一的语言,统一的文字,规定语速等等. 而对于设备之间,协议定义了数据单元使用的 ...

  7. 【物联网毕设基础】单片机:RS485 通信与 Modbus 协议

    文章目录 RS485 通信与 Modbus 协议 单片机 RS485 通信接口.控制线.原理图及程序实例 RS485 通信与 Modbus 协议 在工业控制.电力通讯.智能仪表等领域,通常情况下是采用 ...

  8. RS485通信和Modbus协议

    在工业控制.电力通讯.智能仪表等领域,通常情况下是采用串口通信的方式进行数据交换.最初采用的方式是 RS232 接口,由于工业现场比较复杂,各种电气设备会在环境中产生比较多的电磁干扰,会导致信号传输错 ...

  9. 树莓派4B、Python与三相四线多功能电力仪表通过RS485(modbus RTU协议)收发数据

    树莓派4B+Python与三相四线多功能电力仪表通过RS485(modbus RTU协议)接口发送和接收数据 请耐心把下面的警告⚠️看完 开始之前需要注意以下点:一.那就是安全,生命为本,安全第一.因 ...

  10. RS485 通信与 Modbus 协议

    文章目录 RS485 通信与 Modbus 协议 单片机 RS485 通信接口.控制线.原理图及程序实例 RS485 通信与 Modbus 协议 在工业控制.电力通讯.智能仪表等领域,通常情况下是采用 ...

最新文章

  1. AbstractFactory抽象工厂模式
  2. LINQ从方法中返回查询
  3. 放个手机在单位自动打卡_1秒识别打卡,无感知考勤系统重磅来袭!
  4. c语言读取文件到结构体数组,有关文件读写到结构体数组问题;
  5. Python-cvxopt库的使用(2)(解决QP问题)
  6. retinex算法小感
  7. jmp连mysql_JMP官方教学视频列表
  8. Emacs,最强编辑器,没有之一
  9. Kubernetes — 使用 kubeadm 部署高可用集群
  10. 6-1 求实数和的函数
  11. Spring框架——applicationContext.xml配置文件头部xmlns
  12. Facebook账号被封了怎么办?这份账号申诉指南请收好
  13. Android判断手机是否是小米MIUI系统
  14. python数据框提取子集_pandas 数据子集的获取
  15. 小程序自定义tabbar踩坑笔记
  16. Spring Cloud入门 -- Ribbon服务消费者(Hoxton.SR5版)
  17. JDK的下载安装以及配置
  18. 一张图揭秘在阿里、腾讯、美团工作的区别
  19. 后端调用阿里云快递API接口--后端部分
  20. 视觉SLAM⑤--相机与图像

热门文章

  1. Qt信号和槽机制详解
  2. 【电力】永磁同步电机-自抗扰控制PMSM ADRC附matlab代码
  3. 发送导频信号用到的 matlab function
  4. ASP.NET MVC——XX点餐管理系统后台项目实训总结书
  5. PLC在机械手步进控制中的应用
  6. 服务器上的VGA切换原理,浅谈笔记本中VGA信号切换的原理
  7. Redis配置文件redis.conf配置详解
  8. ANSYS_APDL——实例002-模态分析
  9. springCloud之Feign rpc调用
  10. 产品报告|利用SWOT模型分析趣头条APP