精华内容
下载资源
问答
  • 利用python开发上位机,用于串口通信,将串口通信访问到的数据,并将数据以表格和波形的形式显示出来,注释清晰,对小白相当友好,文件夹中,main.py为主函数,MyWindow.py存放按键响应,串口通信等等各个控件的子...
  • 使用python开发的一个串口上位机应用,主要使用的工具包有pyside2、PyQtgraphy、pyserial。程序入口文件为data_app.py
  • python串口工具,串口上位机

    千次阅读 2019-12-19 18:40:57
    之前发过用tkinter库设计的串口工具UI代码,以下为python串口的逻辑代码,已整理成模块,可以随时保存下来使用。部分函数采用中文命名,只是测试中文函数是否可运行,事实证明可以正常运行。也可另外修改函数名称 1....

    python 使用pyserial串口库开发串口工具

    之前发过用tkinter库设计的串口工具UI代码,以下为python串口的逻辑代码,已整理成模块,可以随时保存下来使用。部分函数采用中文命名,只是测试中文函数是否可运行,事实证明可以正常运行。也可另外修改函数名称

    1. 示例代码(MyPySerial.py)
    # !/usr/bin/python 3.6.5
    # coding=utf-8
    
    import serial
    import serial.tools.list_ports
    import threading
    
    '''
        1、扫描串口列表
        2、打开串口
        3、向串口写数据
        4、从串口读数据
        5、关闭串口
        
        init 初始化串口
            --> 创建线程:
                1. 如果串口未打开,则用于实时扫描串口,检测是否有新设备插入
                    有新设备插入:添加到设备列表,并刷新UI的设备列表提供选择
                    没有新设备:继续扫描
                2. 如果串口已打开,则用于监测串口是否有接收到数据
                    如果有则读取数据,并发送给UI
                    如果没有则继续扫描
            参数:主窗口,端口列表,接收窗口
            返回:线程实例(用于关闭窗口前,先关闭线程)
            
        open 打开串口
            --> 参数:端口号,波特率,超时时间
                返回:串口实例(打开成功)/ None(打开失败)
        
        close 关闭串口
            --> 参数:串口实例
                返回:0(关闭成功)/ -1(关闭失败)
                
        write 写数据
        read 读数据
            
    '''
    
    SERIAL_IS_OPEN = False      # 默认串口关闭
    port_name_list = []         # 端口名称列表
    port_com_list = []          # 端口号列表
    MySerial = None             # 打开的串口
    
    def 扫描串口():
        port_list = list(serial.tools.list_ports.comports())
        if len(port_list) > 0:
            return port_list
        else:
            return None
    
    def 打开串口(port="COM4", bps=115200, timex=5):
        try:
            # 打开串口
            ser = serial.Serial(port, bps, timeout=timex)
    
            if ser.is_open:
                global SERIAL_IS_OPEN
                SERIAL_IS_OPEN = True
                print("--- 串口打开 ---")
                return ser
    
        except Exception as e:
            print("--- 打开异常 ---: ", e)
            return None
    
    def 发送数据(ser, text, code="utf-8"):
        try:
            result = ser.write(text.encode(code))
            if result == len(text):
                print("--- 发送成功 ---:", text)
                return result
            else:
                print("--- 发送错误 ---:", "data len:", len(text), "send len:", result)
                return None
        except Exception as e:
            print("--- 发送异常 ---:", e)
    
    def 读取数据(ser, code="utf-8"):
        if ser.in_waiting:
            str = ser.read(ser.in_waiting).decode(code)
            print("--- 读到数据 ---:", str)
            return str
        else:
            return None
    
    
    def 关闭串口(ser):
        if ser.is_open:
            try:
                global SERIAL_IS_OPEN
                SERIAL_IS_OPEN = False
                ser.close()
                print("--- 串口关闭 ---")
                return 0
            except Exception as e:
                print("--- 关闭异常 ---:", e)
                return -1
        else:
            print("--- 错误 ---:串口未打开!")
            return -1
    
    class SERIAL:
        def __init__(self):
            self.ser = None
            self.get_str = ''
            self.master = None
            self.show_com = None
            self.read_text_win = None
            self.serialThread = None
    
        def serial_thread(self, master, list_port, text_read):
            global SERIAL_IS_OPEN, port_name_list, port_com_list
            global MySerial
            while True:
                if SERIAL_IS_OPEN:
                    self.get_str = 读取数据(MySerial)
                    if self.get_str:
                        # print(self.get_str)
                        text_read.insert(tk.END, self.get_str)
                        master.update()
                else:
                    port_list = 扫描串口()
                    if len(port_name_list) is not len(port_list):   # 只判断列表长度,不可靠。需修改为列表内容判断比较可靠
                        port_name_list.clear()
                        port_com_list.clear()
                        for i in range(0, len(port_list)):
                            port_name_list.append(port_list[i].description)
                            port_com_list.append(port_list[i].device)
                            list_port["values"] = port_name_list
                            if list_port.get() is "":  # 如果当前UI中的端口列表为空,则指定显示第一个
                                list_port.current(0)
                        master.update()
    
        @classmethod
        def init(cls, master, list_port, text_read):
            cls.master = master
            cls.show_com = list_port
            cls.read_text_win = text_read
            cls.serialThread = threading.Thread(target=cls.serial_thread,
                                                args=(SERIAL, cls.master, cls.show_com, cls.read_text_win))
            cls.serialThread.start()
            return cls.serialThread
    
        @classmethod
        def open(cls, port=None, bps=115200, timex=5):
            global port_name_list, port_com_list, MySerial
            if not port:
                port_name = cls.show_com.get()
                index = port_name_list.index(port_name)
                MySerial = 打开串口(port_com_list[index], bps, timex)
            else:
                MySerial = 打开串口(port, bps, timex)
    
        @staticmethod
        def write(text, coding="gbk"):
            global MySerial, SERIAL_IS_OPEN
            if SERIAL_IS_OPEN:
                发送数据(MySerial, text, coding)
    
        @staticmethod
        def read(coding="gbk"):
            global MySerial, SERIAL_IS_OPEN
            str = None
            if SERIAL_IS_OPEN:
                str = 读取数据(MySerial, coding)
            return str
    
        @staticmethod
        def close():
            global MySerial, SERIAL_IS_OPEN
            if SERIAL_IS_OPEN and MySerial:
                关闭串口(MySerial)
    
    
    if __name__ == "__main__":
        import tkinter as tk
        from tkinter import ttk
        root = tk.Tk()
        root.title("测试窗口")
        root.geometry("300x300")
    
        list_box = ttk.Combobox(root, width=22, textvariable=port_name_list, state="readonly")
        list_box.place(x=10, y=10)
    
        text_box = tk.Text(root, width=25, heigh=10)
        text_box.place(x=10, y=50)
    
        def open_serial():
            SERIAL.open()
    
        def send_date():
            SERIAL.write("hello python serial\n", coding="gbk")
    
        def close_serial():
            SERIAL.close()
    
        SERIAL.init(root, list_box, text_box)
    
        button0 = tk.Button(root, text="打开串口", command=open_serial)
        button0.place(x=10, y=200)
        button1 = tk.Button(root, text="发送数据", command=send_date)
        button1.place(x=70, y=200)
        button2 = tk.Button(root, text="关闭串口", command=close_serial)
        button2.place(x=130, y=200)
    
        root.mainloop()
        
    
    2. 测试UI窗口

    测试窗口使用方法:

    1. 直接将示例代码拷贝下来保存为:MyPySerial.py 文件
    2. 运行文件即可打开测试窗口
    3. 选择CH340端口,打开串口
    4. “发送数据”,会向串口发送"hello python serial\n"
    5. 将CH340串口的“tx”和“rx”短接,即可将发送出去的数据接收回显到Text控件
    6. 关闭串口
      注意:本实例在init中会返回线程,需要自行关闭,python主线程关闭,子线程不会自动关闭

    在这里插入图片描述

    展开全文
  • Python开发串口通讯上位机程序三部曲 ** 序 2020很特殊!这个春节假期,除了吃饭、睡觉、追剧、忧国忧民以外,仍然有大把的闲暇时间想想工作的事情。记得之前在很多项目开发中,都需要通过上位机来控制ECU或者通过...

    **

    Python开发串口通讯上位机程序三部曲

    **

    2020很特殊!这个春节假期,除了吃饭、睡觉、追剧、忧国忧民以外,仍然有大把的闲暇时间想想工作的事情。记得之前在很多项目开发中,都需要通过上位机来控制ECU或者通过上位机来读取ECU中的数据。其中上位机和ECU的通讯接口有串口,LIN或者CAN总线。串口作为一种低成本而又简单的通讯方式,仍然有很多客户在使用。毕竟,一个USB转串口工具,淘宝网上只要几十块就可以买一个,而LIN总线或CAN总线转换接口,成本至少在几百元以上。
    在这里插入图片描述
    要实现上位机和ECU之间的串口通讯,除了一个USB转串口硬件工具以外,还需要一个上位机软件。上位机软件可以采用串口调试助手(可以从网上免费下载),但是很多情况下,串口调试助手无法满足控制和数据监视,以及分析功能,还需要根据项目需求,进行定制化开发。定制化开发串口上位机可以采用Visual Basic、Visual C#、labview等软件开发。这些软件特别适合于开发图形化界面。但是这几个软件需要占用很大的硬盘空间,而且对于文件操作,数据记录等并不是特别方便。最近听说python很火,一直好奇能否用python开发一个串口上位机软件,经过这几天的尝试,终于成功了。接下来给大家分享一下。
    在这里插入图片描述

    安装python开发环境

    1. 首先到python官网https://www.python.org/downloads/windows/下载python软件。如下图所示,最新版本为3.8. 本人的电脑是WIN 10 64位操作系统,需要下载的文件为:Windows x86-64 executable installer(64位操作系统一定要下载这个文件,如果下载32位的文件,后果自负)下载好的文件名为:python-3.8.1-amd64.exe.
    2. 双击这个文件,进行安装。安装时,选择Add python3.8 to PATH。这一点也非常重要!选中这个框,后续会省去很多麻烦的。单击Install Now, 可以用默认的安装路径安装。在这里插入图片描述
    3. 安装完成后,在运行窗口或者win10的搜索窗口中输入”cmd”,打开DOS窗口在这里插入图片描述
    4. 在DOS窗口中出现:C:\Windows\system32>,然后输入python, 回车,出现如上图所示的内容,以及“>>>”,说明python已经安装成功。然后在>>>后面,输入exit()可以退出。
    5. 在win10程序中,可以发现新安装的程序:IDLE (python 3.8 64-bit)。运行这个程序,出现IDLE开发环境界面在这里插入图片描述
    6. 在IDLE界面中的File菜单中可以创建一个新文件,我们的python上位机程序就可以存储在这个新文件中。
    7. 好的!我们已经顺利完成第一步,比起Visual studio和LabVIEW,是不是又快又简单啊?先喝杯酒庆祝一下吧!

    安装pyserial模块

    • Python的最大优点是共享和开源,有很多工程师已经开发了很多程序模块,并且无私奉献出来,我们可以直接利用这些现成的模块。是不是相当于踩在巨人的肩膀上一样啊?所以首先我们要感谢一下这些前辈们!他们已经把串行通讯的代码封装在了pyserial模块中(即便封装好,你也可以看到源代码的),接下来我们可以直接安装这个模块了。
    • 大家还记得把大象放进冰箱的三步法吗,那么我们安装pyserial是不是也要经过找到网址,下载软件,安装软件三步法呢?No! 让我们一起见证奇迹是如何发生的吧:运行cmd把DOS窗口打开,在C:\Windows\system32>后面直接输入”pip install pyserial”,然后系统会自动搜索下载链接,下载并且安装,一步搞定!
    • 在C:\Windows\system32>后输入”python”,回车,当出现“>>>”以后,输入import serial, 导入pyserial模块。然后在“>>>”之后,输入“serial”,可以看到pyserial被安装到的文件夹。
    • 好的,pyserial安装也搞定了!在这里插入图片描述

    编写串口上位机软件

    编写串口上位机软件:

    • 功能说明:
      • 上位机首先向ECU发出指令:控制命令(用字母c表示),读取数据指令(用字母r表示)
      • ECU收到指令后,进行处理,如果是c,则将LED蓝灯点亮;如果是r,则将LED红灯点亮,并向上位机发送0x30到0x39的十个数字。
      • 上位机发出r指令后,等待接收数据,接收到数据以后,将数据输出到屏幕。
        重复以上步骤,如果输入字母n,则退出上位机
        软件流程图如下:
        在这里插入图片描述
        打开IDLE软件,创建一个新文件,并且保存为SCI.py
        在这里插入图片描述编写上位机界面程序
    import serial  #导入串口模块
    import time    #导入时间模块,时间模块是Python自带模块,无需安装
    try:
        #打开串口,并且获得串口对象
        SCI1 = serial.Serial("com15",9600,timeout=50)
        #判断是否打开成功
        if (SCI1.isOpen()==True):
            print("串口已经打开!")
    except Exception as exc:
        print("串口打开异常:",exc)
    while True:
        commandFromECU = input("请输入控制命令,c-向ECU发送命令;r-从ECU中读取数据。")  #从键盘上输入一个命令
        SCI1.write(str(commandFromECU).encode("utf-8"))  #将键盘输入的控制命令发送给ECU上的单片机
        if commandFromECU == 'r':          #如果是读取数据,则从串口中接收数据。    
            time.sleep(1)                  #等待1秒,等待接收ECU上单片机返回的数据. ECU会依次发送0x30-0x39等10个数据
            bufferSize = SCI1.in_waiting   #接收ECU上单片机发过来的数据,并且返回数据的大小
            print("接收到",str(bufferSize),'个数据') #打印缓冲区中接收到数据的个数 
            data = SCI1.read_all().hex()           #将接收缓冲区中数据读取到data中
            print(data)                    #将接收到的数据按照16进制打印出来                
        time.sleep(1)                      #等待1秒
        if(input("如果退出,请输入n,如果继续发送命令,请按其他键 ") == 'n'):
            break
    SCI1.close()    #关闭端口
    

    在Run菜单中,选择Run Module或者直接按F5键,运行程序,界面如下:
    在这里插入图片描述好的,大功告成!我们已经完成了上位机和ECU之间的基本通讯流程。是不是软件非常简单呢?个人认为这个是python最大的优点:简约而不简单!

    总结

    我们再回顾一下python开发一个基于串口通讯的上位机程序的步骤:

    1. 到python.org下载python 3.8 64-bit并安装
    2. 使用pip install pyserial安装serial模块
    3. 编写上位机和ECU的通讯流程,画出软件流程图,编写代码,运行测试程序

    熟悉了这个程序以后,我们还可以在这个程序上增加更多的功能:

    • 将收到的数据,打印曲线,用图形显示出来。这个需要用到自带的turtle画图模块
    • 将收到的数据,保存到txt, csv文件中。
    • 将收到的数据,自动发送到邮件中。

    以上每个功能的实现,也只需要几行代码就可以实现,接下来的几年里,我会慢慢介绍给大家。好的,如果大家觉得这个串口好用的话,赶紧把电脑拿出来试一试吧。

    展开全文
  • 前面我们介绍了,如何用Python做一个串口通讯的上位机。用这个上位机我们可以从ECU中读取数据,然后输出到屏幕上。 有些时候,我们需要保存这些数据。那么今天我给大家介绍的就是如何把数据保存到文件中。 我们还是...

    前面我们介绍了,如何用Python做一个串口通讯的上位机。用这个上位机我们可以从ECU中读取数据,然后输出到屏幕上。 有些时候,我们需要保存这些数据。那么今天我给大家介绍的就是如何把数据保存到文件中。
    我们还是从简单的开始入手:

    将数据保存到txt文件中。

    我们先从三步法开始:
    第一步:打开文件``
    第二步:写数据到文件中
    第三步:关闭文件
    对应的源代码为:

    data = ['30','31','32','33','34']    #要存储的数据列表
    file = open('C:\\Users\\tti\\Desktop\\python\\test.txt', 'a+')   #打开文件,如果没有,则创建一个新文件,文件操作模式,采用追加模式
    file.write(data[0])     #保存列表中的第一个元素
    file.write(data[1])     #保存列表中的第一个元素
    file.close()                #关闭文件
    
    

    在open()函数中,我们一般需要用到两个参数:
    一个参数是带路径的文件名,因为“\”在python中是用于特殊字符,比如“\n”代表换行,“\”的实际意思是“\”。所以上面的路径‘C:\Users\tti\Desktop\python\test.txt’ 实际上代表的是’ C:\Users\tti\Desktop\python\test.txt’。千万记住!
    另外一个参数是文件操作类型,常用的几种模式如下表所示:

    模式描述
    r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    w+打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。

    运行程序之后,我们会在C:\Users\tti\Desktop\python\路径下,找到一个test.txt文件,打开文件发现数据已经被写入。
    在这里插入图片描述三步法已经很简单了,但是python还觉得很罗嗦,采用with open() as 语句,把close函数省了。

    with open ('C:\\Users\\tti\\Desktop\\python\\test.txt', 'a+') as file1: #打开文件
       	file1.write(data[2])    #保存列表中的第三个元素
        file1.write(data[3])    #保存列表中的第四个元素
    
    

    注意:with后面的语句要缩进;write()函数中参数是字符串类型的。
    那我们现在就在串口通讯程序后面加入下面语句:

    with open ('C:\\Users\\tti\\Desktop\\python\\test.txt', 'a+') as file1: #打开文件,在文件末尾,追加数据
    	file1.write(data)    #保存数据
    
    

    在这里插入图片描述运行程序,输入r读取数据指令,在C:\users\tti\desktop\python文件中打开test.txt文件,数据已经被写入。
    在这里插入图片描述文件写入是成功了,不过现在很少有人用txt来做数据分析,除非是一些log文件。比如我们可以把一些关键数据和时间保存在txt文件中,供以后查看:

    with open ('C:\\Users\\tti\\Desktop\\python\\test.txt', 'a+') as file1: #打开文件,在文件末尾,追加数据
        file1.write(str(time.localtime().tm_year)) #保存当前时间:年
        file1.write(str(time.localtime().tm_mon)) #保存当前时间:月
        file1.write(str(time.localtime().tm_mday)) #保存当前时间:日
        file1.write(str(time.localtime().tm_hour)) #保存当前时间:小时
        file1.write(str(time.localtime().tm_min)+": ") #保存当前时间:分
    	file1.write(data+'\n')    #保存数据,并换行
    
    

    至此,我们已经完成了第一步。接下来我们看看如何将数据保存到csv文件中

    将数据保存到csv文件中。

    CSV(Commma-Separated Value)是用逗号分隔符,以纯文本形式存储表格数据(数字和文本)的文件格式。CSV文件可以用excel打开和编辑,便于数据统计和分析。
    要把列表data中的数据写入到csv中的一行,可以用下面代码:

    with open ('C:\\Users\\tti\\Desktop\\python\\test.csv', 'a+',newline='') as file1: #打开文件
        writer = csv.writer(file1) #创建一个实例
        writer.writerow(data)      #给csv文件写入一行数据
    
    

    当获取到data数据之后,可以立即调用这段代码,保存数据。代码如下图所示:
    在这里插入图片描述运行这段程序以后,在C:\Users\tti\Desktop\python文件夹中,用excel打开test.csv文件,数据已经被写入到文件的每一行中。
    在这里插入图片描述然后我们可以用excel对数据进行分析,用各种图表,曲线分析数据。
    是不是比我们想象的要简单很多呢。Python充分利用了现有的模块,在此基础上可以快速开发出自己需要的功能。这就是python流行的一个主要原因之一!

    展开全文
  • 用verilog编写的udp与上位机通信代码+对应的用python 编写的上位机代码
  • stm32上位机python代码

    2019-04-14 00:16:30
    使用tkinter来编写这个上位机的界面。本程序可以与stm32通信,当然只需要做简单修改就可以与51单片机通信
  • 串口通讯,保存文件一样,绘制曲线对于python而言也是易如反掌。接下来,就让大伙儿看看我的神操作。 绘制曲线,我们可以使用python自带的Turtle(海龟画图)模块。绘图的基本步骤如下: 导入...

    用Visual Basic或者C#, LabVIEW等软件开发的上位机界面,和文本式交互界面比较而言,就是可以用图形方式来显示数据。那么python可不可以用图形来显示数据呢?Of course! 和串口通讯,保存文件一样,绘制曲线对于python而言也是易如反掌。接下来,就让大伙儿看看我的神操作。

    绘制曲线,我们可以使用python自带的Turtle(海龟画图)模块。绘图的基本步骤如下:

    1. 导入Turtle模块
    2. 设定画笔的宽度,速度,颜色等
    3. 抬起画笔,移动画笔到起点,放下画笔,移动画笔到终点。
    4. 重复2、3步骤,直到图形画完。

    Turtle的常用的绘图函数有:
    turtle.home() - 将位置和方向恢复到初始状态,位置初始坐标为(0,0),方向初始为("standard"模式为right向右即东,"logo"模式是up向上即北)
    turtle.dot(size, *color) - 按给定直径size画圆点, color圆点颜色
    turtle.speed(speed) – 设置画笔的速度,speed为0-10的整数(1-10越来越快,但是0表示最快)
    turtle.pencolor(*args) - 设置或返回画笔颜色(设置后海龟箭头的外轮廓也是这个颜色)
    turtle.pensize(width) – 设置画笔宽度
    turtle.pendown() - 画笔落下,海龟移动时将画线
    turtle.penup() - 画笔抬起,海龟移动时不画线
    turtle.goto(x,y) - 前往一个绝对坐标
    turtle.left(angle) - 画笔方向向左转,angle为左转的角度
    turtle.right(angle) - 画笔方向向右转,angle为右转的角度
    turtle.write(arg, move=False, align=“left”, font=(“Arial”, 8, “normal”)) - 绘制文字,arg为要绘制的纹波,align为对齐方式,font为字体
    turtle.showturtle() - 显示画笔(即海龟箭头)
    turtle.hideturtle() - 隐藏画笔(即海龟箭头)
    turtle.clear() - 清屏并且画笔形状也恢复默认,保持画笔位置和方向不变

    这些函数的命名真是简单直观而易懂。和我们用笔画图的动作也非常相似。相信大家几分钟之内就能掌握,并且画出自己的第一个图形。
    当python从串口中读取到数据存储到列表data中以后,我们就可以把data中的数据按照时间顺序,把这些数据用图形显示出来:

    1. 先绘制x轴和y轴,x轴表示的是时间,y轴表示收到的数据的值的大小。
    turtle.speed(0)      #画笔速度,10为最慢
    turtle.goto(200,0)   #画时间轴
    turtle.write("时间")  #标注为时间轴
    turtle.penup()       #抬起画笔
    turtle.goto(0,200)   #到y轴的终点
    turtle.write("数据")  #标注为数据轴
    turtle.pendown()     #画笔落下
    turtle.home()        #绘制y轴,同时画笔回到原点,
    
    1. 选择画笔颜色
    turtle.pencolor("blue")  #重新选择画笔颜色为蓝色
    
    1. 计算每个数据点的x坐标和y坐标
    for i in range(len(data)):  #把所有的数据循环一遍
        x = i*20           #设置时间值,比如20ms一个点
        y = int(data[i])   #获取y的值 
    
    1. 绘制每一个点
    turtle.goto(x,y)   #画笔移动到x,y坐标
    turtle.dot(5,"red")#在该点绘制一个红色圆点
    
    1. 抬起画笔,回到原点,绘图结束
    turtle.penup()  #画笔抬起
    turtle.home()   #画笔回到原点,画线结束
    

    下图是整个程序的源代码:

    import serial  #导入串口模块
    import time    #导入时间模块,时间模块是Python自带模块,无需安装
    import csv     #导入csv模块,csv模块是Python自带模块,无需安装
    import turtle  #导入Turtle画图模块,此模块为Python自带,无需安装
    try:
        SCI1 = serial.Serial("com15",9600,timeout=50)  #打开串口,并且获得串口对象
        #判断是否打开成功
        if (SCI1.isOpen()==True):
            print("串口已经打开!")
    except Exception as exc:
        print("串口打开异常:",exc)
    while True:
        commandFromECU = input("请输入控制命令,c-向ECU发送命令;r-从ECU中读取数据。")  #从键盘上输入一个命令
        SCI1.write(str(commandFromECU).encode("utf-8"))  #将键盘输入的控制命令发送给ECU上的单片机
        if commandFromECU == 'r':          #如果是读取数据,则从串口中接收数据。
            data = []                      #将data列表清空,准备存放新的数据
            time.sleep(1)                  #等待1秒,等待接收ECU上单片机返回的数据. ECU会依次发送0x30-0x39等10个数据
            bufferSize = SCI1.in_waiting   #接收ECU上单片机发过来的数据,并且返回数据的大小
            print("接收到",str(bufferSize),'个数据') #打印缓冲区中接收到数据的个数 
            for i in range(bufferSize):
                data.append(SCI1.read(1).hex())     #将接收缓冲区中数据读取到data中
            print(data)
            #将数据保存到csv文件中
            with open ('C:\\Users\\tti\\Desktop\\python\\test.csv', 'a+',newline='') as file1: #打开文件,在文件末尾,追加数据
                writer = csv.writer(file1) #创建一个实例
                writer.writerow(data)      #给csv文件写入一行数据
            #把接收到的数据打印成曲线输出
            turtle.speed(0)      #画笔速度,10为最慢
            turtle.goto(200,0)   #画时间轴
            turtle.write("时间")  #标注为时间轴
            turtle.penup()       #抬起画笔
            turtle.goto(0,200)   #到y轴的终点
            turtle.write("数据")  #标注为数据轴
            turtle.pendown()     #画笔落下
            turtle.home()        #绘制y轴,同时画笔回到原点,
            turtle.pencolor("blue")  #重新选择画笔颜色为蓝色
            for i in range(len(data)):  #把所有的数据循环一遍
                x = i*20           #设置时间值,比如20ms一个点
                y = int(data[i])   #获取y的值 
                turtle.goto(x,y)   #画笔移动到x,y坐标
                turtle.dot(5,"red")#在该点绘制一个红色圆点
            turtle.penup()  #画笔抬起
            turtle.home()   #画笔回到原点,画线结束
        time.sleep(1)                      #等待1秒
        if(input("如果退出,请输入n,如果继续发送命令,请按其他键 ") == 'n'):
            break
    SCI1.close()    #关闭端口
    
    展开全文
  • 经常的时候我们要实现两个代码之间的通信,比如说两个不同不同人写的代码要对接,例如将python指令控制Arduino控件的开关,此处使用串口通信是非常方便的,下面笔者将结合自己踩过的坑来讲述下自己的学习经历。...
  • python上位机开发实例-python上位机

    千次阅读 2020-10-30 00:43:28
    python上位机接受到的字符为"1’,则print出ok,如果字符是"0’则print出ng。 2.实际效果:提供一个简易的ui让用户方便输入实现3. 准备环境:python3、serial模块、easygui模块、单片机stc89c524. 如果...
  • Python+QT5写的串口助手

    2020-03-10 14:40:05
    Python+QT5写的串口助手,适合学习Python和QT使用,也适用于开发使用。具体开发及内容见博客:https://blog.csdn.net/qq_37832932/article/details/104773741
  • [PYTHON] 串口通讯上位机开发 文章目录[PYTHON] 串口通讯上位机开发准备过程第三方库:Serial第三方库:Tkinter 准备过程 第三方库:Serial 0、检测可用串口 import serial.tools.list_ports def SearchPorts(): ...
  • python串口调试GUI

    2016-05-15 18:22:16
    python实现的串口调试GUI,支持串口命令的发送与接收
  • 一个用python3的Tkinter模块和pyserial模块写的串口调试助手,想学习上位机串口编程的要参考一下,Tkinter做的界面不够qt炫酷,但也够用
  • python实现串口通信

    千次阅读 2020-02-08 23:43:26
    因为店家只给了我两页纸的vc0706通信...3 实现串口通信 3.1 发现端口 3.2 发送命令 3.2.1 协议格式 3.2.2serial传送的方式 3.3 获取版本号(hello world) 3.4 复位 3.5 照相 3.5.1停止当前帧刷新 3.5.2...
  • Python串口通信发送浮点型数据发送步骤 发送步骤 导入pyserial库——import serial 用于操作串口(详情见serial简介) 初始化串口——serial.Serial portx = "/dev/ttyUSB0" #端口(此处为Unix下的端口号,...
  • python 虚拟串口通信

    千次阅读 2020-05-02 12:13:46
    准备着手写一个串口工具,当前编程环境,并没有办法接好下位机平台,需要模拟出一个串口,不断发送信息,方便调试串口工具。...这两个串口是互相接通的,一个com 可以当作上位机,一个com可以当作下位机 ...
  • 智能移动小车平台上位机界面设计告一段落,特此记录一下整体的框架,以免之后再用的时候回忆不起来。 一、地图获取路径数据: 1、首先通过奥维地图绘制从起点到终点的多条路径,然后根据最优路径选择算法(此处选用...
  • 串口通讯具有简单易用的特点广泛应用于测试设备的通讯和数据传递、单片机与计算机的通讯等,本案例基于Python语言制作一个用于接收燃油质量流量计的串口通讯上位机,实现数据的读取和保存。1. 相关知识点:1.1 ...
  • python实现串口通讯小程序(GUI界面)

    千次阅读 多人点赞 2020-02-13 11:20:51
    python实现串口通讯小程序(GUI界面) 使用python实现串口通讯需要使用python的pyserial库来实现,这个库在安装python的时候没有自动进行安装,需要自己进行安装。 1、安装pyserial库: 打开命令行窗口,在命令行中...
  • import serial import easygui import time ser = serial.Serial() ser.baudrate = 9600 ...print(ser) ser.open() print(ser.is_open) ...需要的库:serial(串口调用模块)easygui(提供一个简易的ui让用户输入)
  • Python部分 # ----------------------------------------- # # Author: Leo # Date: 2021/1/11 # Function: 通过串口通信来实现对Arduino的控制 # ----------------------------------------- # import serial from...
  • HID 通信下位机给上位机传送数据
  • 单片机若接受到字符,读取字符后,向python上位机发送字符(1->X,2->T),若python上位机接受到的字符为‘1’,则print出OK,如果字符是‘0’则print出NG。 2.实际效果:提供一个简易的ui让用户方便输入实现 3....
  • 利用Python实现串口通信——以Arduino UNO为例实现原理基础内容Python部分Arduino部分Arduino==>PythonPython==>Arduino应用案例 实现原理 利用Python实现串口通信本质上是利用python输出一个信号(字符串、...
  • 通常用python写好上位机要与板子通过串口通信的时候(比如命令,参数等),对于这之间的数据格式转换是有特定要求的,比如上位机到板子之间是以字节流进行数据传输,而用户输入到上位机的数据通常是字符串;...
  • 断断续续学了几周Stm32后,突然想实现上位机和下位机的通信,恰好自己学过一点python,便想通过python实现通信. 在网上看见python库pyserial可以实现此功能,便去官网找了一下 ,附上官网pyserial档链 接:...
  • 想在上位机端实时调下位机的pid,所以需要看一下波形,拒绝盲调。同时使用pyqtgragh可以轻松地将数据进行动态可视化。 文章目录环境准备串口通信基本连接串口动态参数可视化实时效果展示 环境准备 pyserial pip ...
  • Ubuntu+Python环境做上位机

    千次阅读 2018-11-27 16:57:17
    最近需要制作程控电阻箱的上位机,使得大学毕业后就不再接触硬件的我无从下手.拿到机器后不知道怎么与其进行通信,Google上的资料也很少,现将...先说一下接口问题,串口通信不一定非要使用232(9针)接口,usb-usb或者usb-...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 532
精华内容 212
关键字:

python串口通信上位机

python 订阅