树莓派软串口设置+完整示例pigpio猪皮库

软串口库pigpio可以使用树莓派的所有GPIO针用作串口来通信,且保留树莓派原有通信功能。缺点:只能一个bytes一个bytes读取数据,需要自己拼接数据。
树莓派一共有26根GPIO,所以最多可以做13个串口出来,如果需要多串口通信的同学可以试试。
除串口外,猪皮库还有自己的i2c通信接口和GPIO通信示例,详情可以查看http://abyz.me.uk/rpi/pigpio/download.html
一、安装pigpio库
sudo apt install pigpio
二、启动软串口
sudo pigpiod
三、示例,以我买的液位传感器为例

import os
import time
import pigpio
import threading

BAUD = 9600


class Liquid(object):

    def __init__(self, rx_pin, tx_pin, data_cb):
        self._rx_pin = rx_pin
        self._tx_pin = tx_pin
        self._data_cb = data_cb
        # PIGPIO
        self._pi = pigpio.pi()
        if not self._pi.connected:
            os.system('sudo pigpiod')
            self._pi = pigpio.pi()
        self._pi.set_mode(self._rx_pin, pigpio.INPUT)
        self._pi.set_mode(self._tx_pin, pigpio.OUTPUT)
        pigpio.exceptions = False
        self._pi.bb_serial_read_close(self._rx_pin)
        pigpio.exceptions = True
        self._pi.bb_serial_read_open(self._rx_pin, BAUD, 8)
        # ATTR
        self._thread_ts = 1
        self._msg = bytes()
        # THREAD
        self._thread = threading.Thread(target=self._working)
        self._thread.daemon = True
        self._thread.start()

    def _working(self):
        while 1:
            count, data = self._pi.bb_serial_read(self._rx_pin)
            if count:
                self._msg += data
                if len(self._msg) == 4:
                    if (self._msg[0] + self._msg[1] + self._msg[2]) & 0x00ff == self._msg[3]:
                        self._data_cb(module='LIQUID', data=self._msg[1] * 256 + self._msg[2])
                        self._msg = bytes()
            time.sleep(self._thread_ts)

    def write_data(self, msg):
        self._pi.wave_clear()
        self._pi.wave_add_serial(self._tx_pin, BAUD, msg)
        data = self._pi.wave_create()
        self._pi.wave_send_once(data)
        if self._pi.wave_tx_busy():
            pass
        self._pi.wave_delete(data)

    def set_thread_ts(self, thread_ts):
        self._thread_ts = thread_ts

    def get_thread_ts(self):
        return self._thread_ts


if __name__ == '__main__':

    def _data_cb(module, data):
        print(module, data)

    liquid = Liquid(rx_pin=15, tx_pin=14, data_cb=_data_cb)

都是一个字一个字敲出来的,有兴趣可以一块交流沟通,互相学习。

你可能感兴趣的:(树莓派软串口设置+完整示例pigpio猪皮库)