精华内容
下载资源
问答
  • python打开串口
    千次阅读
    2020-12-17 14:11:13

    一、

    为了使用python操作串口,首先需要下载相关模块:

    1. pyserial (http://pyserial.wiki.sourceforge.net/pySerial)

    2. pywin32 (http://sourceforge.net/projects/pywin32/)

    二、

    google “python 串口 操作”关键字,找到相关python代码,

    我是从http://currentlife.blog.sohu.com/53741351.html页面上拷贝的代码。

    咱得参考人家的代码修改。

    三、

    发送数据可用chr和pack组装处理,如:

    snd = ''

    snd += chr(97)

    data = 0x12345678

    snd += pack.('i', data)

    snd += chr(0x64)

    self.l_serial.write(snd);

    #发送的数据是(16进制):61 78 56 34 12 64

    接收的数据用ord函数,将字节内容变为整数,进行判断处理。

    如:if ord(recv[2])== 0x01:

    判断recv[2]是否是0x01.

    注意:不能这样比较

    if recv[2] == 'a':

    pass

    也不能这样比较

    if recv[2] == 0x97:

    pass

    因为python的字符串存储机制我不清楚,所以不知道为什么这样比较不可以。

    帖点代码,依据前面的参考代码修改的:

    #coding=gb18030

    import sys,threading,time;

    import serial;

    import binascii,encodings;

    import re;

    import socket;

    from struct import *;

    class ComThread:

    def __init__(self, Port=0):

    self.l_serial = None;

    self.alive = False;

    self.waitEnd = None;

    self.port = Port;

    def waiting(self):

    if not self.waitEnd is None:

    self.waitEnd.wait();

    def SetStopEvent(self):

    if not self.waitEnd is None:

    self.waitEnd.set();

    self.alive = False;

    self.stop();

    def start(self):

    self.l_serial = serial.Serial();

    self.l_serial.port = self.port;

    self.l_se

    更多相关内容
  • python串口传输.rar

    2019-09-06 18:09:32
    python串口通信,读取文件内容并通过串口传输至接收程序。
  • 1 硬件设备 TTL串口摄像头(VC0706) USB转TTL烧录器 2 serial安装 第一次安装的是serial的包导包的时候发现下载错了,正确应该是pyserial。安装后直接import就可以了...方法二:搜索电脑上的设备管理器,打开以后然
  • python操作串口

    千次阅读 2021-03-14 20:53:45
    打开串口 def DOpenPort(portx, bps, timeout): try: # 打开串口,并得到串口对象 ser = serial.Serial(portx, bps, timeout=timeout) # 判断是否打开成功 if(False == ser.is_open): ser = -1 except Exception as ...
    import serial  # 导入模块
    ser = serial.Serial('com2', 9600, timeout=300)
    ser.write(data)  # 写数据
    readbuf = ser.read(ser.in_waiting)
    ser.close()

    完整代码 

    import serial  # 导入模块
    import threading
    import time
    import logging
    import sys
    
    
    class UartInfo(object):
        def __init__(self, fd, count, fail):
            self.fd = fd
            self.count = count  # 测试次数
            self.fail = fail  # 失败次数
    
        response = False
        image_addr = 0x00
        image_crc = 0x00
        version = 0
        write_event = threading.Event()
    
    
    uart = UartInfo(-1, 0, 0)
    
    
    def logging_init():
        logging.basicConfig(#  filename="test.log", # 指定输出的文件
            level=logging.DEBUG,
            format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
    
        return True
    
    
    # 十六进制显示
    def hexShow(argv):
        try:
            result = ''
            hLen = len(argv)
            for i in range(hLen):
                hvol = argv[i]
                hhex = '%02x' % hvol
                result += hhex+' '
    
            logging.info('Led Read:%s', result)
            return result
        except Exception as e:
            print("---异常---:", e)
    
    
    def crc_sum(data, data_len):
        crc = 0
        i = 0
        while(i < data_len):
            crc += data[i]
            i += 1
        return crc & 0x00FF
    
    
    def crc_sum_u32(data, data_len):
        crc = 0
        i = 0
        while(i < data_len):
            crc += data[i]
            i += 1
        return crc
    
    # 打开串口
    def DOpenPort(portx, bps, timeout):
        try:
            # 打开串口,并得到串口对象
            ser = serial.Serial(portx, bps, timeout=timeout)
            # 判断是否打开成功
            if(False == ser.is_open):
               ser = -1
        except Exception as e:
            print("---异常---:", e)
    
        return ser
    
    
    # 关闭串口
    def DColsePort(ser):
        uart.fdstate = -1
        ser.close()
    
    
    # 写数据
    def DWritePort(ser, data):
        result = ser.write(data)  # 写数据
        logging.info(ser)
        logging.info("Led Write %s(%d)" % (data.hex(), result))
        return result
    
    
    # 读数据
    def ReadData_Thread(ser):
        # 循环接收数据,此为死循环,可用线程实现
        readstr = ""
        while(-1 != ser):
            if ser.in_waiting:
                try:  # 如果读取的不是十六进制数据--
                    readbuf = ser.read(ser.in_waiting)
                    if readbuf[0] == 0x55 and readbuf[1] == 0xaa:
                        readstr = readbuf
                    else:
                        readstr = readstr + readbuf
    
                    hexShow(readstr)
    
                    if (readstr[3] == 0x01) and (len(readstr) > 10):
                        uart.version = readstr[16]
                        uart.response = True
                        uart.write_event.set()
                    elif (readstr[3] == 0x21) and (readstr[4] == 0x00) and (readstr[5] == 0x00):
                        uart.response = True
                        uart.write_event.set()
                    elif (readstr[3] == 0x22) and (len(readstr) > 10):
                        uart.image_addr = (readstr[6] << 24 & 0xFF000000)
                        uart.image_addr += (readstr[7] << 16 & 0x00FF0000)
                        uart.image_addr += (readstr[8] << 8 & 0x0000FF00)
                        uart.image_addr += (readstr[9] << 0 & 0x000000FF)
                        uart.response = True
                        uart.write_event.set()
                    elif (readstr[3] == 0x23) and (len(readstr) > 25):
                        uart.response = True
                        uart.write_event.set()
    
                except:  # --则将其作为字符串读取
                    readbuf = ser.read(ser.in_waiting)
                    hexShow(readbuf)
    
    
    def GetVersion(ser):
        print("GetVersion")
        writebuf = bytearray([0x55, 0xaa, 0x00, 0x01, 0x00, 0x00])
        # crc
        writebuf.append(crc_sum(writebuf, len(writebuf)))
        DWritePort(ser, writebuf)
    
        logging.info("take")
        uart.response = False
        uart.write_event.clear()
        uart.write_event.wait(timeout=3)
        uart.write_event.clear()
        logging.info("give")
        if uart.response == False:
            logging.info("fail")
            return False
        else:
            return True
            
    
    # 测试任务
    def Test_Thread(ser):
        while (-1 != ser):
            uart.response = False
            uart.image_addr = 0x00
            uart.image_crc = 0x00
            uart.version = 0
            logging.info("count:%d", uart.count)
            logging.info("fail:%d", uart.fail)
            print("count", uart.count)
            print("fail", uart.fail)
    
            if GetVersion(ser):
                logging.info(uart.version)
                if uart.version == 0x37:
                    otafile = "./UartV108.bin"
                else:
                    otafile = "./UartV107.bin"
            else:
                uart.fail += 1
                uart.count += 1
                continue
    
            print("ota:", otafile)
            logging.info("ota:%s", otafile)
            time.sleep(2)
    
            uart.count += 1
            time.sleep(5)
    
    
    def TestStop(ser):
        DColsePort(uart.fd)  # 关闭串口
    
    
    if __name__ == "__main__":
        if 2 != len(sys.argv):
            print("please enter COM")
            exit()
        else:
            uart.tty = sys.argv[1]
    
        logging_init()
        uart.fd = DOpenPort(uart.tty, 115200, None)
    
        if(uart.fd != -1):  # 判断串口是否成功打开
            threading.Thread(target=Test_Thread, args=(uart.fd,)).start()
            threading.Thread(target=ReadData_Thread, args=(uart.fd,)).start()
    
    

     

    展开全文
  • python 操作 串口

    千次阅读 2021-11-19 14:28:14
    一、导入serial模块 参考https://www.jb51.net/article/164455.htm 模块下载地址... 找到serial文件夹,并找到python的安装位置 放入到 site-packages文件夹C:\Users\Administra

    一、导入serial模块

    1. 参考https://www.jb51.net/article/164455.htm
    2. 模块下载地址https://files.pythonhosted.org/packages/1e/7d/ae3f0a63f41e4d2f6cb66a5b57197850f919f59e558159a4dd3a818f5082/pyserial-3.5.tar.gz
      在这里插入图片描述
    3. 找到serial文件夹,并找到python的安装位置 放入到 site-packages文件夹C:\Users\Administrator\AppData\Local\Programs\Python\Python39\Lib\site-packages
      在这里插入图片描述

    二、编写程序

    1. 程序参考https://www.cnblogs.com/dongxiaodong/p/9992083.html
    2. 收发参考https://blog.csdn.net/bluebloodye/article/details/102870827

    三、验证

    1. 插入USB转TTL
    2. 执行下面程序
      import serial 
       
      import serial.tools.list_ports
       
      port_list = list(serial.tools.list_ports.comports())
      print(port_list)
       
      if len(port_list) == 0:
          print("无可用串口!")
      else:
          for i in range(0, len(port_list)):
              print(port_list[i])
      
      在这里插入图片描述

    四、收发测试代码

    这里采用读取数据超时的方法来做处理,能读取一定时间内的全部数据
    注意一下这几个点

    1. ser.read了之后 in_waiting马上变成0
    2. bytearray重新配置长度时,会清楚所有数据
    3. ser.read的数据,是byte数组
    import serial 
    import time
    import serial.tools.list_ports
    import threading
     
    port_list = list(serial.tools.list_ports.comports())
    print(port_list)
     
    if len(port_list) == 0:
        print("无可用串口!")
    else:
        for i in range(0, len(port_list)):
            print(port_list[i])
            
    print(time.time())
    ##发送 
    #d=bytes.fromhex('10 11 12 34 3f') 
    #s.write(d)
    #s.close()
            
    
    DATA = "" # 读取的数据
    DATA_ALL = bytearray(40960)
    DATA_LEN = 0
    NOEND = True # 是否读取结束
    DATA_IN_FLAG = 0
    START_TIME = 0
     
    # 读数据的本体
    def read_data(ser):
        global DATA, NOEND , DATA_IN_FLAG , START_TIME, DATA_ALL , DATA_LEN
        START_TIME = time.time()
        
        # 循环接收数据(此为死循环,可用线程实现)
        while NOEND:
            if ser.in_waiting:
                START_TIME = time.time()
                DATA_IN_FLAG = 1
                length = ser.in_waiting
                
                DATA = ser.read(length)# 注意 ser.read了之后 in_waiting马上变成0#DATA_ALL = bytearray(DATA_LEN+length)
                for i in  range(0, length):
                    DATA_ALL[DATA_LEN+i] = DATA[i]
                
                #print("DATA_LEN=%d"%(DATA_LEN))
                DATA_LEN+=length
                #DATA = ser.read(ser.in_waiting).decode("gbk")
                #print("\n>> receive: ", DATA, "\n>>", end="")
                #print(">>", end="")
                
                if(DATA == "quit"):
                    print("oppo seri has closen.\n>>", end="")
                        
                    
            else:
                if DATA_IN_FLAG:
                    #print("time.time() - START_TIME = %d \r\n"%(time.time()))
                    if time.time() - START_TIME > 0.010:#串口超时10ms
                        DATA_PRINT = bytearray(DATA_LEN)
                        for i in  range(0, DATA_LEN):
                            DATA_PRINT[i] = DATA_ALL[i]
                        
                        print("\n>> receive: ", DATA_PRINT, "\n>>", end="")
                        START_TIME = time.time()
                        DATA_IN_FLAG = 0
                        DATA_LEN = 0
    
                
                
     
     
    # 打开串口
    def open_seri(portx, bps, timeout):
        ret = False
        try:
            # 打开串口,并得到串口对象
            ser = serial.Serial(portx, bps, timeout=timeout)
     
            # 判断是否成功打开
            if(ser.is_open):
                ret = True
                th = threading.Thread(target=read_data, args=(ser,)) # 创建一个子线程去等待读数据
                th.start()
        except Exception as e:
            print("error!", e)
     
        return ser, ret
     
     
     
    # 关闭串口
    def close_seri(ser):
        global NOEND
        NOEND = False
        ser.close()
     
    # 写数据
    def write_to_seri(ser, text):
        res = ser.write(text.encode("gbk")) # 写
        return res
     
    # 读数据
    def read_from_seri():
        global DATA
        data = DATA
        DATA = "" #清空当次读取
        return data
     
    if __name__ == "__main__":
        
        # ser, ret = open_seri("COM4", 115200, None) # 串口com3、bps为115200,等待时间为永久
        # if ret == True: # 判断串口是否成功打开
        #     count = write_to_seri(ser, "exit")
        #     print("写入总字节数:", count)
     
        # 打开一个串口
        port = input("输入串口名:")
        ser, ret = open_seri(port, 921600, None) # 串口com3、bps为115200,等待时间为永久
     
        # oprate_lst = {"quit":close_seri}
        # print("操作数字所对应的行为,1:read_from_seri 2:write_to_seri 3:close_seri: ")
        while True:
            text = input(">>")
            write_to_seri(ser, text)
            if text == "quit":
                close_seri(ser)
                print("bye!")
                break
    
    
    展开全文
  • python串口连接

    千次阅读 2021-01-15 03:56:06
    python真的是强大。还能处理串口的数据。今天主要解释下串口如何进行通信的。首先进行串口通信用的是import serial也就是这个包起的作用。首先我们可以先测试哪个端口是可以使用的。# coding:utf-8import serial....

    python真的是强大。

    还能处理串口的数据。

    今天主要解释下串口如何进行通信的。

    首先进行串口通信用的是

    import serial

    也就是这个包起的作用。

    首先我们可以先测试哪个端口是可以使用的。

    # coding:utf-8

    import serial.tools.list_ports

    plist = list(serial.tools.list_ports.comports())

    if len(plist) <= 0:

    print("没有发现端口!")

    else:

    plist_0 = list(plist[0])

    serialName = plist_0[0]

    serialFd = serial.Serial(serialName, 9600, timeout=60)

    print("可用端口名>>>", serialFd.name)

    查看现在可以用的端口数

    我的电脑输出的是com3

    serialport = serial.Serial(serialName, 115200, timeout=1,parity=serial.PARITY_EVEN, rtscts=1)

    serialName 就是端口名称,也就是上边自动检测到的com3

    其余的参数是 波特率

    bytesize为每个字节的比特数,设置值为FIVEBITS, SIXBITS,SEVENBITS, EIGHTBITS 5-8比特;

    parity设置校验位PARITY_NONE, PARITY_EVEN,PARITY_ODD PARITY_MARK,

    PARITY_SPACE,用来设置校验位;stopbits停止位,用来指示字节完成,可以选择的设置STOPBITS_ONE,

    timeout (float)读出超时设置;xonxoff (bool)软件流控开关;

    if x.isOpen():

    print("open success")

    else:

    print("open failed")

    检查串口是否正常打开,只有打开了才能进行通信

    现在基本的准备工作做完了,下来是进行发送和接收信息。

    处理串口的发送代码

    def fasong():

    f = 0

    while f <1:

    print("zai fa song ")

    time.sleep(3)

    myinput=bytes([0x3f,0x0D,0x0A]) # 需要发送的十六进制数据的 ? 回车键 以及换行符

    x.write(myinput)

    time.sleep(3)

    f = f + 1

    没有直接写成死循环是因为希望进行顺序通信的,我在网上看到有的是写了个死循环,然后开启了线程进行通信的,这里没用这个方法。

    开始的时候我只发送了一个? 但是返回的数据都是空,一直寻找不到原因,最后通过示波器,把发送代码的波形进行对比发现发送的波形除了?还有一个回车以及换行的信号。

    补足了代码也就返回了信息。

    def jieshou():

    j = 0

    while j < 1:

    print("zai jie shou")

    # print(x.inWaiting)

    while x.inWaiting() > 0:

    # global lastval

    myout=x.read(8) # 提取接收缓冲区中的前8个字节数

    rainval = myout.decode('gbk')

    # val = rainval - lastval

    print(rainval)

    # lastval = rainval

    j = j + 1

    这是接收部分的代码。

    展开全文
  • python serial 打开串口重启
  • ser = serial.Serial("COM6", 115200, bytesize = 8,timeout=0.5) # 打开串口 print("我要开始了:") res=[] while (1): ch = ser.readline(1) result = '' hLen = len(ch) for i in range(hLen): hv
  • 1、需要模块以及测试工具模块名:pyserial使用命令下载:python -m pip install pyserial串口调试工具:sscom5.13.1.exe2、导入模块import serial3、打开串口直接通过new一个Serial()的实例即可打开返回实例# ...
  • python串口读写源代码程序+详细注释 简单的python串口读写介绍 ser serial Serial 0 是打开第一个串口 print ser portstr 能看到第一个串口的标识 windows下是COM1 ser write “hello" 就是往串口里面写数据 ...
  • Python 玩转串口(基于 pySerial)

    千次阅读 多人点赞 2021-09-26 17:41:39
    如果掌握了Python操作串口的方法,那我们就可以利用Python强大的数据处理能力,快速开发出许多好用的工具。 串口的基本操作 在使用 Python 之前,我们先回想一下平时我们是如何使用串口的。总结来说,无非就是...
  • Windows版本下的python并没有内置串口通讯的pyserial的库,所以需要自己下载。参照了网上的教程,有许多用的pip的安装方式,但是试了几个都没有用,所以想到用GitHub下载库文件,步骤分为:1.在Github下载python-...
  • 就是打开串口后,启动一个线程来监听串口数据的进入,有数据时,就做数据的处理(也可以发送一个事件,并携带接收到的数据)。我没有用到串口处理太深的东西。客户的原程序不能给你,不过我给你改一下吧。里面的一些...
  • python读取串口、网络编程、文本处理与文件操作 **前言:**之所以把本文的名字起得这么长是为了突出文中包涵的每一部分。如题,文中程序正是包涵了读取串口、网络编程、文本处理与文件操作。这是我们项目的数据处理...
  • 2015-04-02 回答python非常适合写一些测试的脚本,如快速的串口通信测试等。如果使用vc++ qt开发,可能用时较多,使用python,如果掌握使用方法,可以直接读写测试,配合设备或是串口助手,很快验证与实现。python有...
  • 使用python来调试串口

    2020-12-05 03:29:22
    标签:串口模块的波特率比较特别,找了几个串口工具都不支持。。。所以,干脆用python自己来写了,其实已经好奇好久了,别人的工具各种不顺手。需要pyserial的支持,兼容各种平台,不需要新编译二进制文件。先贴一个...
  • kelly 发布于:周二, 09/27/2016 - 15:07 ,关键词:硬件开发不可避免要与串口打交道,使用python下的pyserial可以使串口测试和设备调用的工作自动化。这里介绍pyserial的一些基础知识。1、安装pyseriallinux上直接...
  • 使用pyserial进行串口传输 一、安装pyserial以及...ser = serial.Serial(0) 是打开第一个串口 print ser.portstr 能看到第一个串口的标识,windows下是COM1 ser.write(“hello”) 就是往串口里面写数据 ser.close() 就
  • 主要介绍了Python实现串口通信(pyserial)过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 我使用Pyserial的python来使用串口,​​代码如下:import serialportName = 'COM5'ser = serial.Serial(port=portName)# Use the serial port...但是,问题是,如果端口已经打开(例如另一个应用程序),当我尝试打开它时...
  • 使用python是通过com串口连接硬件设备注意点1.首先安装serial库,可以运行pip insatll pyserial或在ide上安装2.Serial()方法参数Port:串口号;Baudrate:波特率Parity:奇偶校验位Bytesize:数据位3.由于串口使用的是...
  • 学习第一课通过 ubuntu桌面串口软件 CuteCom与 程序端的实现串口通信。硬件连接采用2条 USB转485的线,对连。 两条USB转485线: T/R+ ---------T/R+ , T/R- ---------T/R-查询从系统启动到现在串口插拔的信息,显示...
  • Python串口通信代码-亲测好用

    千次阅读 2020-05-22 09:45:28
    最近开发一个项目需要使用python进行串口的...#打开串口 serialPort="COM3" #串口号 baudRate=9600 #波特率 ser=serial.Serial(serialPort,baudRate,timeout=0.5) print("参数设置:串口=%s ,波特率=%d"%(seri...
  • 今天小编就为大家分享一篇对python3 Serial 串口助手的接收读取数据方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • timestamp=1563807838&req_id=201907222303570100230601438916BD5&group_id=67160264916892390441、这节课我们来实现串口的写入与接收,同样查看pyseri...
  • Python串口操作

    2022-05-03 21:28:21
    Python串口发送数据,可以与单片机通信
  • 为了通过python编程控制串口发送数据给单片机,编写此程序
  • Python接收串口数据 程序

    千次阅读 2021-05-19 16:20:05
    软件打开之后是这样的,点击添加端口,就可以创建的一对虚拟串口。 有一些串口软件助手是无法检测到虚拟串口的,这样就需要多换几个软件试一试,或者自己编一个串口软件助手,像我在测试的时候,发现现成的串口软件...
  • 使用Ubuntu+Python3 外接USB转TTL,通过串口发送数据。运行Python时报错如下: from: can't read /var/mail/serial 或者: from serial import Serial ModuleNotFoundError: No module named 'serial' 通常是找...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,467
精华内容 2,986
关键字:

python打开串口