树莓派安装modbus tk库

一、安装modbus-tk

1.安装modbus-tk并卸载重装 pyserial(需要安装python2.5以上)
sudo pip3 install modbus-tk

//卸载
sudo pip3 uninstall pyserial
sudo pip3 uninstall serial
//重装
sudo pip3 install pyserial
2.从机测试代码:
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import sys
import logging
import threading
import modbus_tk
import modbus_tk.defines as cst
import modbus_tk.modbus as modbus
import modbus_tk.modbus_rtu as modbus_rtu
import serial
import time
import RPi.GPIO as GPIO
logger = modbus_tk.utils.create_logger(name="console", record_format="%(message)s")
# 创建server
server = modbus_rtu.RtuServer(serial.Serial("/dev/ttyUSB0", 9600))
slaver = server.add_slave(1)
# BCM GPIO编号
pins = [17,18,27,22,23,24,25,4]
def setup():
    # 采用BCM编号
    GPIO.setmode(GPIO.BCM)
    # 设置所有GPIO为输出状态,且输出低电平
    for pin in pins:
        GPIO.setup(pin, GPIO.OUT)
        GPIO.output(pin, GPIO.LOW)
   
    slaver.add_block("coil", cst.COILS, 0, 16)
    slaver.set_values("coil", 0, 16*[0])
       
def loop():
    logger.info("running...")
    # 启动从机
    server.start()
    while True:
        values = slaver.get_values("coil", 0, 8)
        #print values[0]
        for i in range(0, 8):
            if values[i] == 1:
                GPIO.output(pins[i], GPIO.HIGH)
            else:
                GPIO.output(pins[i], GPIO.LOW)
       
        # 必要的延时
        time.sleep(0.5)
def destory():
    logger.info("destory")
    for pin in pins:
        GPIO.output(pin, GPIO.LOW)
        GPIO.setup(pin, GPIO.IN)
   
    # 停止从机
    server.stop()
       
if __name__ == "__main__":
    setup()
    try:
        loop()
    except KeyboardInterrupt:
        destory()

2.1查看 USB 设备 使用的是哪个串口
ls -l /dev/ttyUSB*
//crw-rw---- 1 root dialout 188, 0 4月  20 21:24 /dev/ttyUSB0
2.2运行测试,代码报错
pi@raspberrypi:~/Desktop $ sudo python modbus_slave.py 
Traceback (most recent call last):
  File "modbus_slave.py", line 12, in <module>
    import RPi.GPIO as GPIO
ModuleNotFoundError: No module named 'RPi'

//原因没安装RPi.GPIO库
//安装 RPi.GPIO
sudo pip3 install RPi.GPIO

再次运行测试代码,使用modbus poll通讯正常




3.1主机测试程序:

由于tk库历程是安全线程的(即超时就会退出程序 )不适合我用,所以写了测试的代码

import serial #导入模块
import time

import binascii

try:

    #端口,GNU / Linux上的/ dev / ttyUSB0 等 或 Windows上的 COM3 等
    portx="/dev/ttyUSB2"
    #波特率,标准值之一:50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200
    bps=9600
    #超时设置,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒)
    timex=5
    # 打开串口,并得到串口对象
    ser=serial.Serial(portx,bps,timeout=timex)
    print("串口详情参数:", ser)

    print(ser.port)#获取到当前打开的串口名
    print(ser.baudrate)#获取波特率
    #Tx:004-01 01 00 00 00 08 3D CC
    red_all='0101000000083DCC'#modbus读取线圈指令01H的报文
    data = bytes.fromhex(red_all)
    result=ser.write(data)
    print("写总字节数:",result)


    #print(ser.read())#读一个字节
    # print(ser.read(10).decode("gbk"))#读十个字节
    #print(ser.readline().decode("gbk"))#读一行
    #print(ser.readlines())#读取多行,返回列表,必须匹配超时(timeout)使用
    #print(ser.in_waiting)#获取输入缓冲区的剩余字节数
    #print(ser.out_waiting)#获取输出缓冲区的字节数

    #循环接收数据,此为死循环,可用线程实现
    while True:
        result=ser.write(data)#读取线圈
        time.sleep(1)
        
        if ser.in_waiting:
            read_data=ser.read(ser.in_waiting )#读取缓存区数据
            r_data= str(binascii.b2a_hex(read_data))[2:-1]#把数据转为HEX格式
            print("收到数据:",r_data.upper() )#转为大写并打印数据
    print("---------------")
    ser.close()#关闭串口


except Exception as e:
    print("---异常---:",e)

再打开一个终端,两个终端分别运行两个测试程序
若主机程序的终端显示收到数据: 01010142D1B9
PS:
42是因为我把第1和第6个线圈置一了,
若直接运行应为收到数据:01010100CRC,CRC的值就不算了(太懒..)

即为主从通讯正常

注意:当结束串口程序时务必使用ctrl+C 终止程序,不要使用ctrl + Z,ctrl+z这样会导致串口无法正常关闭,从而导致串口号被占用,导致出现每次的串口号不同这个问题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容