Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议。
Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库。
1、字符串的发送接收
短接串口的2、3脚,创建一个文本,如:
或者你可以稍微添加几句,变成你任意输入后打印出你的键入信息。
其中,read(value)方法的参数value为需要读取的字符长度。如果想要全部读取,提供两个方法:
1)inWaiTIng::监测接收字符。inWaitTIng返回接收字符串的长度值,然后把这个值赋给read做参数。
2)readall()::读取全部字符。
2、十六进制显示
十六进制显示的实质是把接收到的字符诸葛转换成其对应的ASCII码,然后将ASCII码值再转换成十六进制数显示出来,这样就可以显示特殊字符了。
在这里定义了一个函数,如hexShow(argv),代码如下:
3、十六进制发送
十六进制发送实质是发送十六进制格式的字符串,如‘\xaa’,‘\x0b’。重点在于怎么样把一个字符串转换成十六进制的格式,有两个误区:
1)‘\x’+‘aa’是不可以,涉及到转义符反斜杠
2)‘\\x’+‘aa’和r‘\x’+‘aa’也不可以,这样的打印结果虽然是\xaa,但赋给变量的值却是‘\\xaa’
这里用到decode函数,
需要注意一点,如果字符串list的长度为奇数,则decode会报错,可以按照实际情况,用字符串的切片操作,在字符串的开头或结尾加一个‘0’
假如在串口助手以十六进制发送字符串“abc”,那么你在python中则这样操作“self.l_serial.write(”\x61\x62\x63“)”
当然,还有另外一个方法:
同样可以达到相同目的。python读取串口信息#e#
4、python简单程序读取串口信息的方法
具体分析如下:
这段代码需要调用serial模块,通过while循环不断读取串口数据
5、Python简单串口收发GUI界面
以下是一个具有基本功能的串口通信PC机的GUI界面,简单地实现了下位机与PC的通信界面,下位机还是用的STM32F103。
#encoding=utf-8
__author__ = ‘freedom’
from Tkinter import *
from serial import *
import ttk
class GUI(Frame):
def __init__(self,master):
frame = Frame(master)
frame.pack()
#串口设置相关变量
self.port = 0
self.baudrate = 9600
#串口号提示
self.lab1 = Label(frame,text = ‘Serial Number’)
self.lab1.grid(row = 0,column = 0,sTIcky = W)
#串口号选择下拉菜单
self.boxValue = StringVar()
self.boxChoice = ttk.Combobox(frame,textvariable = self.boxValue,state = ‘readonly’)
self.boxChoice[‘value’] = (‘COM1’,‘COM2’,‘COM3’,‘COM4’)
self.boxChoice.current(0)
self.boxChoice.bind(‘《《ComboboxSelected》》’,self.Choice)
self.boxChoice.grid(row = 1,column = 0,sTIcky = W)
#波特率选择提示
self.lab2 = Label(frame,text = ‘Baudrate Set’)
self.lab2.grid(row = 2,column = 0,sticky = W)
#波特率选择下拉菜单
self.boxValueBaudrate = IntVar()
self.BaudrateChoice = ttk.Combobox(frame,textvariable = self.boxValueBaudrate,state = ‘readonly’)
self.BaudrateChoice[‘value’] = (9600,115200)
self.BaudrateChoice.current(0)
self.BaudrateChoice.bind(‘《《ComboboxSelected》》’,self.ChoiceBaudrate)
self.BaudrateChoice.grid(row = 3,column = 0,sticky = W)
#输出框提示
self.lab3 = Label(frame,text = ‘Message Show’)
self.lab3.grid(row = 0,column = 1,sticky = W)
#输出框
self.show = Text(frame,width = 40,height = 5,wrap = WORD)
self.show.grid(row = 1,column = 1,rowspan = 4,sticky = W)
#输入框提示
self.lab4 = Label(frame,text = ‘Input here,please!’)
self.lab4.grid(row = 5,column = 1,sticky = W)
#输入框
self.input = Entry(frame,width = 40)
self.input.grid(row = 6,column = 1,rowspan = 4,sticky = W)
#输入按钮
self.button1 = Button(frame,text = “Input”,command = self.Submit)
self.button1.grid(row = 11,column = 1,sticky = E)
#串口开启按钮
self.button2 = Button(frame,text = ‘Open Serial’,command = self.open)
self.button2.grid(row = 7,column = 0,sticky = W)
#串口关闭按钮
self.button3 = Button(frame,text = ‘Close Serial’,command = self.close)
self.button3.grid(row = 10,column = 0,sticky = W)
#串口信息提示框
self.showSerial = Text(frame,width = 20,height = 2,wrap = WORD)
self.showSerial.grid(row = 12,column = 0,sticky = W)
#串口初始化配置
self.ser = Serial()
self.ser.setPort(self.port)
#self.ser.setBaudrate(self.baudrate)
#self.ser.open()
#print self.ser.isOpen()
#print self.ser
def Choice(self,event):
context = self.boxValue.get()
list = [“COM1”,‘COM2’,‘COM3’,‘COM4’]
if context in list:
self.port = list.index(context)
self.ser.setPort(self.port)
print self.port
def ChoiceBaudrate(self,event):
self.baudrate = self.boxValueBaudrate.get()
self.ser.setBaudrate(self.baudrate)
print self.baudrate
def Submit(self):
context1 = self.input.get()
n = self.ser.write(context1)
output = self.ser.read(n)
print output
self.show.delete(0.0,END)
self.show.insert(0.0,output)
def open(self):
self.ser.open()
if self.ser.isOpen() == True:
self.showSerial.delete(0.0,END)
self.showSerial.insert(0.0,“Serial has been opend!”)
def close(self):
self.ser.close()
if self.ser.isOpen() == False:
self.showSerial.delete(0.0,END)
self.showSerial.insert(0.0,“Serial has been closed!”)
root = Tk()
root.title(“Serial GUI”)
#root.geometry(“3000×4000”)
app = GUI(root)
root.mainloop()