赞
踩
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、主要是理解程序的原理和串口的原理:下图为程序展示
串口通讯-发送程序和接收程序演示
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。