当前位置:   article > 正文

Python-串口通讯_python 串口通讯

python 串口通讯

Python-串口通讯

串口通讯(Serial Communication),是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式。
1、前提条件:【需要理解串口的通讯方式,发送和接收,皆只能打开一个串口】
(1)提供一对收发信息的COM口或者使用虚拟工具创建COM口(vspd7.2.308-模拟串口工具)
(2)需要一个调试助手,自动搜索监控电脑的COM口,用于调试程序(XCOM V2.0-串口调试工具)
在这里插入图片描述


2、编写主要程序:【发送】

#_*_ coding:utf-8 _*_

import serial #导入serial模块,serial模块封装了对串口的访问
import threading
#threading提供了一个比thread模块更高层的API来提供线程的并发性。这些线程并发运行并共享内存。

import serial.tools.list_ports  #读取串口

port_list = list(serial.tools.list_ports.comports())

if len(port_list) == 0:
    print("无可用串口!")

elif len(port_list) > 0:
    for i in port_list:  #遍历整个列表
        print(i)         #打印出查找的串口列表


class Ser(object):       #创建关于串口的类

    def __init__(self,port):
        self.port = port
        # 打开端口
        self.ser = serial.Serial(self.port, baudrate= 9600, timeout = 1,)

    def send_message(self):

        if self.ser.isOpen():      #如果串口已经打开
            print("\nopen %s success" % self.port)  #打印串口成功打开的信息

            self.contunt = True
            while self.contunt:
            #com1端口向com2端口写入数据 字符串必须译码
               self.contunts = input("输入内容:")

               self.ser.write(str(self.contunts).encode("gb2312"))

        #encode()函数是将字符串转化成相应编码方式的字节形式
        #如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码的字节数据。
        #如果不转换,COM1发送到COM2的信息,COM2(调试助手)中文会识别不出来或者会出现乱码现象

               if self.contunts == "quiet":  #输入内容等于Quiet后,执行以下命令
                  self.contunt = False
                  break  #结束循环
        else:   #如果没有读取到com1串口,则执行以下程序
             print("open failed")
             self.ser.close()  #关闭端口

    def receive_message(self):
        if self.ser.isOpen():  # 如果串口已经打开
            print("\nopen COM1 sucess!")
            print("接收信息:")

            self.receive = True     #建立标志
            while self.receive:     #表示一直循行读取的内容
                receives = self.ser.readlines()
                # readlines()读取多行内容

                if receives == []:
             #没接受有效数据时,会一直读取到空列表,等于空列表时,利用continue语句再次重新读取
                    continue

                elif receives == [b'quiet\r\n']:  #确定接收到这个元素后,执行以下程序
                    self.receive = False
                    print("\n已关闭COM1端口")
                    self.ser.close()  # 关闭端口
                    break  #结束循环

                elif receives != []:  # 表示当接收数据不等于空列表[]时,执行以下程序
                    for asr in receives: #运用for语句将元素提取出来
                        read = asr.decode("gb2312")  #将bytes字节数据,转化为字符数据
                        print(read)
            '''
            decode()的作用是将bytes数据类型转化成str数据类型的函数,
            不论什么编码方式的二进制数据,通过decode函数后,统一编成utf-8编码格式
            因为utf-8格式是python里面的标准
            '''
        else:  # 如果没有读取到com1串口,则执行以下程序
            print("\nopen failed")
            self.ser.close()  # 关闭端口

if __name__ == '__main__':

    print("\n收发信息程序已开始!")

    action = Ser("COM1") #这里可更改连接的串口

    t1_send = threading.Thread(target = action.send_message()) 
    #创建一个线程,运行发送信息的函数send_message()
    t1_send.start()  #启动线程
    
    print("\n收发信息程序已关闭!")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92

3、编写主要程序:【接收】

#_*_ coding:utf-8 _*_

import serial #导入serial模块,serial模块封装了对串口的访问
import threading
#threading提供了一个比thread模块更高层的API来提供线程的并发性。这些线程并发运行并共享内存。

import serial.tools.list_ports  #读取串口

port_list = list(serial.tools.list_ports.comports())

if len(port_list) == 0:
    print("无可用串口!")

elif len(port_list) > 0:
    for i in port_list:  #遍历整个列表
        print(i)         #打印出查找的串口列表


class Ser(object):       #创建关于串口的类

    def __init__(self,port):
        self.port = port
        # 打开端口
        self.ser = serial.Serial(self.port, baudrate= 9600, timeout = 1,)

    def send_message(self):

        if self.ser.isOpen():      #如果串口已经打开
            print("\nopen %s success" % self.port)  #打印串口成功打开的信息

            self.contunt = True
            while self.contunt:
            #com1端口向com2端口写入数据 字符串必须译码
               self.contunts = input("输入内容:")

               self.ser.write(str(self.contunts).encode("gb2312"))

        #encode()函数是将字符串转化成相应编码方式的字节形式
        #如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码的字节数据。
        #如果不转换,COM1发送到COM2的信息,COM2(调试助手)中文会识别不出来或者会出现乱码现象

               if self.contunts == "quiet":  #输入内容等于Quiet后,执行以下命令
                  self.contunt = False
                  break  #结束循环
        else:   #如果没有读取到com1串口,则执行以下程序
             print("open failed")
             self.ser.close()  #关闭端口

    def receive_message(self):
        if self.ser.isOpen():  # 如果串口已经打开
            print("\nopen COM1 sucess!")
            print("接收信息:")

            self.receive = True     #建立标志
            while self.receive:     #表示一直循行读取的内容
                receives = self.ser.readlines()
                # readlines()读取多行内容

                if receives == []:
             #没接受有效数据时,会一直读取到空列表,等于空列表时,利用continue语句再次重新读取
                    continue

                elif receives == [b'quiet\r\n']:  #确定接收到这个元素后,执行以下程序
                    self.receive = False
                    print("\n已关闭COM1端口")
                    self.ser.close()  # 关闭端口
                    break  #结束循环

                elif receives != []:  # 表示当接收数据不等于空列表[]时,执行以下程序
                    for asr in receives: #运用for语句将元素提取出来
                        read = asr.decode("gb2312")  #将bytes字节数据,转化为字符数据
                        print(read)
            '''
            decode()的作用是将bytes数据类型转化成str数据类型的函数,
            不论什么编码方式的二进制数据,通过decode函数后,统一编成utf-8编码格式
            因为utf-8格式是python里面的标准
            '''
        else:  # 如果没有读取到com1串口,则执行以下程序
            print("\nopen failed")
            self.ser.close()  # 关闭端口

if __name__ == '__main__':

    print("\n收发信息程序已开始!")

    action = Ser("COM2") #这里可更改连接的串口
    t2_receive = threading.Thread(target = action.receive_message())
     #创建一个线程,运行接收信息的函数receive_message()
    t2_receive.start() #启动线程
    
    print("\n收发信息程序已关闭!")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91

4、主要是理解程序的原理和串口的原理:下图为程序展示
在这里插入图片描述

串口通讯-发送程序和接收程序演示

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/688999
推荐阅读
相关标签
  

闽ICP备14008679号