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收发信息程序已关闭!")

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收发信息程序已关闭!")

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

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

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山中坐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值