IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> python通过486串口控制发送并接收传感器数据 -> 正文阅读

[嵌入式]python通过486串口控制发送并接收传感器数据

这里使用多线程与互斥锁的方法,开启了两个线程一个发送线程,不停的向传感器发送数据回发请求,另一个为监听线程,在回发请求发送后,经过一定的延时操作,接收传感器的回发数据

1.注意报文发送的格式,在python中是以十六进制列表形式发送的.

2.注意线程与互斥锁的使用,在该代码的基础上想要通过报文控制传感器实现更多的功能,
这里python虽然是多线程的,但是传感器控制只是通过486接口进行的,所以本质上是不停的通过各种发送喂不同的报文.
所以多模块的开发依然实在这两个收发线程的基础上决定.

如下图,通过本文程序不同的向激光位移传感器发送数据请求报文,然后接收返回的测距信息(butes格式),还需进行进一步的代码解码
在这里插入图片描述
返回值:

打印串口收到的数据: b'\x02\x06\nJ\x03F'
<class 'bytes'>
****************************************************************************************************
打印串口收到的数据: b'\x02\x06\nJ\x03F'
<class 'bytes'>
****************************************************************************************************
打印串口收到的数据: b'\x02\x06\nJ\x03F'
<class 'bytes'>
****************************************************************************************************
打印串口收到的数据: b'\x02\x06\nK\x03G'
<class 'bytes'>
****************************************************************************************************

代码正文:

# coding=utf-8
"""用于通过485串口对位移传感器的数据进行读取"""
import serial
import threading
import time
import platform

python_version = platform.python_version()[0:1]  # 获取当前python环境的版本


class Serial_Control():
    def __init__(self, port, baudrate):

        self.port = port  # 获得当前端口值
        self.baudrate = baudrate  # 获得设定波特率

        self.t_main_bool = True
        self.statistical_fail_num = 0  # 用于统计发送后没有接收到数据的次数

        self.open_serial_control()

    def set_port(self, port):
        self.port = port  # 获得当前端口值

    def open_serial_control(self):
        t_main = threading.Thread(target=self.init_main_serial_thread)
        t_main.setDaemon(True)
        t_main.start()

    def set_off(self):
        self.t_main_bool = False

    def init_main_serial_thread(self):
        self.ser = serial.Serial(port=self.port, baudrate=self.baudrate)
        self.ser.timeout = 2
        print("初始化串口成功 34")

        t1 = threading.Thread(target=self.serial_listen)
        t1.setDaemon(True)
        self.mutex_t1_t2_one = threading.Lock()
        self.mutex_t1_t2_two = threading.Lock()

        self.mutex_t2_t3_one = threading.Lock()
        self.mutex_t2_t3_two = threading.Lock()

        t2 = threading.Thread(target=self.serial_send)
        t2.setDaemon(True)
        mutexFlag = self.mutex_t1_t2_two.acquire(True)  # True表示堵塞

        t1.start()
        t2.start()

        print("开启t1,t2完毕\n")

    def serial_listen(self):
        global python_version
        """aa #开始
    例子:
    20 #类型
    20 #地址
    36 #功能码
    01 #数据长度
    00 #数据
    e4 1c #校验
    0d #结束
    """
        while True:
            mutexFlag = self.mutex_t1_t2_one.acquire(True)  # True表示堵塞

            n = self.ser.inWaiting()  # 等待数据的到来,并得到数据的长度(字符长度)
            if n:

                return_data = self.ser.read(n)  # 读取n个数据 暂且把return_data当作 b'abacadaebcbdbe'形式

                print("打印串口收到的数据: " + str(return_data))
                print(type(return_data))
                print("*" * 100)
                print("\n")

                self.statistical_fail_num = 0


            else:
                if self.statistical_fail_num > 10:
                    print("连续" + str(self.statistical_fail_num) + "次没有收到 未收到串口的回发数据,请检测连接本系统的开发板是否匹配 118")

                self.statistical_fail_num = self.statistical_fail_num + 1

            if self.t_main_bool == False:
                break

            self.mutex_t1_t2_two.release()  # 解锁

    def serial_send(self):

        while True:
            mutexFlag = self.mutex_t1_t2_two.acquire(True)  # True表示堵塞
            self.ser.write([0x02, 0x43, 0xB0, 0x01, 0x03, 0xF2])  # aa0101280101b8b70d
            time.sleep(0.1)
            self.mutex_t1_t2_one.release()  # 解锁


class Control_send():
    def __init__(self):
        self.x = 0
        self.y = 0
        self.p = 0



if __name__ == '__main__':
    car = Serial_Control(port='COM4', baudrate=9600)

    time.sleep(0.5)
    while True:
        print("*" * 20)
        order = input("请输入控制命令(q为退出程序):")
        if order == "q":
            car.set_off()
            break

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-11-14 21:52:49  更:2021-11-14 21:55:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:57:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码