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()  #启动线程

    t2_receive = threading.Thread(target = action.receive_message())
     #创建一个线程,运行接收信息的函数receive_message()
    t2_receive.start() #启动线程
    
    print("\n收发信息程序已关闭!")








你可能感兴趣的:(python)