精华内容
下载资源
问答
  • 我自己用python制作了一个串口工具。正常的说,发送一个指令下去,单片机会回复一个相应的应答; 我现在出现了一种情况,第一次发送指令,无应答,第二次发送指令,回复...
  • python 使用线程接收串口数据,并同时可进行串口数据发送。 问题:1、如何将发送与接收同时通过线程来完成操作。 2、接收到的串口数据 打印数据显示为b‘XXX’格式,那么怎么转换呢? 由于从没系统看过python的...

    有关python 串口通讯助手的源码下载,请打开这篇文章 https://blog.csdn.net/xiaoeleis/article/details/105820455

    python 使用线程接收串口数据,并同时可进行串口数据发送。

    问题:1、如何将发送与接收同时通过线程来完成操作。

                2、接收到的串口数据 打印数据显示为b‘XXX’格式,那么怎么转换呢?

    由于从没系统看过python的基础语法,问题看似简单,却又不能很快的解决。

     

    import serial
    import time
    import threading
    
    class SerialPort:
    	message='' 
    	def __init__(self,port,buand):
    		super(SerialPort, self).__init__()
    		self.port=serial.Serial(port,buand)
    		self.port.close()
    		if not self.port.isOpen():
    			self.port.open()
    	def port_open(self):
    		if not self.port.isOpen():
    			self.port.open()
    	def port_close(self):
    		self.port.close()
    	def send_data(self):
    			data = input("请输入要发送的数据(非中文)并同时接收数据: ")
    			n=self.port.write((data+'\n').encode())
    			return n
    	def read_data(self):
    		while True:
    			self.message=self.port.readline()
    			print(self.message)
    
    serialPort="COM7"   #串口
    baudRate=9600       #波特率
    
    if __name__=='__main__':
        
    	mSerial=SerialPort(serialPort,baudRate)
    	t1=threading.Thread(target=mSerial.read_data) 
     
    	t1.start()
    	while True:
             time.sleep(1)
             mSerial.send_data()  

     

    展开全文
  • python 串口效率测试

    千次阅读 2016-06-26 20:21:07
    先问一个问题。项目开发,串口使用python写好呢还是C++写好? 我写了一个小程序,想测试一下电脑...串口1等待串口2的数据,一旦接收数据就回发给串口2。 串口2等待串口2的数据,一旦接收数据就回发给串口1。

    先问一个问题。项目开发,串口使用python写好呢还是C++写好?


    我写了一个小程序,想测试一下电脑串口之间的极限传递效率。

    电脑上插着两个usb转串口,分别RXD接TXD,.

    然后启动两个python程序,分别开启串口1,串口2,.波特率115200,超时为1秒。

    串口1等待串口2的数据,一旦接收到数据就回发给串口2。

    串口2等待串口2的数据,一旦接收到数据就回发给串口1。

    使用定时器测试等待接受的时间,就能测出串口的极限交换频率。(当然,不同波特率和不同的数据量,不同电脑,不同的USB转串口会有所不同)

    贴一下代码

    程序1:


    import serial
    import datetime
    
    ser1 = serial.Serial()
    ser1.baudrate = 115200
    ser1.port = "COM23"
    ser1.timeout = 1
    ser1.open()
    
    
    while True:
        start = datetime.datetime.now()
        ser1.readline()
        print datetime.datetime.now()- start
        ser1.write("12345\r\n")

    程序2:

    import serial
    import datetime
    
    ser1 = serial.Serial()
    ser1.baudrate = 115200
    ser1.port = "COM24"
    ser1.timeout = 1
    ser1.open()
    
    
    while True:
        start = datetime.datetime.now()
        ser1.readline()
        print datetime.datetime.now()- start
        ser1.write("12345\r\n")

    最后测得时间差是0.014s。换算过去是71Hz。

    不知道C++这么写会是一个什么成绩。

    如果有兴趣,手头有两个串口,可以试试看。虚拟串口软件不能使用,效果不一样,我测出来是0.002s,没啥意义。。

    有测过的可以留个言~


    展开全文
  • 串口助手 波特率 57600 数据位 8 检验位 None 停止位 1 接收到的数据为(十六进制显示) E0 00 无论发送什么,接收的都是E0 和 00 的组合 觉得很诡异,但其后必须原因! 可是为什么呢?真是哔了狗了! 各位给...
  • python串口提高实时性

    2020-12-19 23:05:43
    今天在设计python串口代码时遇见一个问题接收到的数据打印出来,一直都是两三组连在一起,即我的目标数据是: 7e307d02087d01557e 但是我把接收到的数据精处理打印出来后是:7e307d02087d01557e7e307d02087d01557e...

    问题描述

    今天在设计python串口代码时遇见一个问题,接收到的数据打印出来,一直都是两三组连在一起,即我的目标数据是:
    7e307d02087d01557e
    但是我把接收到的数据经过处理打印出来后是:7e307d02087d01557e7e307d02087d01557e
    或者打印结果是:7e307d02087d01557e7e307d02087d01557e7e307d02087d01557e
    额。。。这显然不是我需要的结果了。

    解决方式

    先说下我的思路,首先引入getopt库,实现串口的串口号和波特率可以由命令行参数改变,这点说实话有些鸡肋。

    test_param = {"com": "com1", "baudrate": "3000000"}
    
        # 尝试获取命令行参数,c->指定的com口,b->指定的波特率,s->secret_file,t->test_file
        try:
            options, argv = getopt.getopt(sys.argv[1:], "c:b:")
        except getopt.GetoptError:
            sys.exit()
    
        # 根据命令行的参数内容,调整字典中键值对应的value
        for option, value in options:
            if option in ("-c", "--comname"):
                test_param['com'] = value
                print("com: {0}".format(test_param['com']))
    
            if option in ("-b", "--baudrate"):
                test_param['baudrate'] = value
                print("baudate : {0}".format(test_param['baudrate']))
    
        uartmanage = TUartManage(test_param["com"], test_param['baudrate'])
    

    其次是构建python的pyserial串口功能类TUartManage,主要是有两个参数,串口号和波特率。
    在进行类的初始化时,主要是建立了一个**bytearray()**数组,因为这个串口程序最终是要服务于协议栈使用,所以根据需求决定的,但是影响说实话不大,因为python想要做一些类型、格式等等的改变真的是太容易了。

    class TUartManage(object):
        def __init__(self, com, baudrate):
            self.__com = com
            self.__baudrate = baudrate
            self.__read_flag = False
            self.data_bytes = bytearray()
            self.__com_uart = serial.Serial(port=self.__com, baudrate=self.__baudrate, timeout=0.1)
            if self.__com_uart.is_open:
                print('open ' + self.__com + ' success !!!')
    

    此外,self.__com_uart是建立的串口对象,在这里是打开串口一,并给定了一个波特率,波特率最后说给了多少。
    看下下面的实现程序:

        def __read_data(self):
            '''
            在线程内循环接收数据,数据发送端选用的正点原子的串口调试工具,最大支持3000K的波特率,所以
            本程序实时性实测在波特率为3000ke时接收正常。
            :return: None
            :note 数据缓存在self.data_bytes中,可由外界直接调用获取
            '''
            while self.__com_uart.isOpen() and self.__read_flag:
                if self.__com_uart.in_waiting:
                    self.data_bytes = self.__com_uart.read(self.__com_uart.in_waiting)
                    if self.data_bytes[0] == 0x7e:
                        data_end = self.data_bytes.find(0x7e, 1)
                        self.data_bytes = self.data_bytes[0:data_end+1].hex()
                        self.__com_uart.reset_input_buffer()
    
        def com_start_read(self, rx_size=1*1024*1024):
            """
            设置接收buf的size,并创建一个线程,专门用来实时接收数据
            :param rx_size: 默认设置1M的接收缓存
            :return: None
            """
            self.__com_uart.set_buffer_size(rx_size=rx_size)
            self.__read_flag = True
            read_thread = threading.Thread(target=self.__read_data)
            read_thread.setDaemon(True) #守护进程,自动运行结束退出,或者主进程结束时,自动结束
            read_thread.start()
    

    先来说下额外的知识点:

    如果在一个类中,想要将一些参数、函数设置为私有属性,即类似于C语言的static变量、函数这样子的,只可以在本文件内使用,外界无法查看与调用,这时可以采用在首字母前加两个下划线的形式,在本文程序内均有涉及,关于私有属性的知识点,最近会整理下,感兴趣可以翻一下博客。

    继续来说下上面的程序,如果想读取数据时可以调用com_start_read函数,可以通过此函数设置serial的接收缓存大小,默认为1M。此函数建立一个带守护属性的线程,即此线程退出方式有两种,一是函数运行完成,自然退出,但是考虑到串口读取函数一定是需要一直读取的,所以退出时一般是利用他的守护属性,即当主线程退出时,也会结束守护线程。

    真正的串口读取函数其实是:__read_data函数,但是你也可以发现,他是一个具有私有属性的函数,所以外界调用时是看不见的。此函数是以:

    while self.__com_uart.isOpen() and self.__read_flag:
    

    来作为循环判断依据的,所以此函数正常退出时,会有两种方式,一是串口被关闭,条件不成立,会立即结束循环,二是将允许读串口标志位self.__read_flag变为False,这部分贴上来的代码上没有,因为我还没写,其实就是再建立一个com_stop_read函数,在里面将允许读串口标志位self.__read_flag变为False。
    至于这么做的目的当时是为了适应协议在不同时刻需要设置不同的缓存size问题,还有就是移植性会比较好的。

    最后再来说一下最初的问题,怎么提高串口的实时性,其实我当时犯的错误是,每次都从接收缓存内读取数据,但是一直没有对其进行清除,所以会带着上次的数据,造成实时性不好的假象,所以使用:

    self.__com_uart.read(self.__com_uart.in_waiting)
    

    来读串口数据时,每次读完一定要在最后对其进行清零,可别在最开始清零,不然你容易得到一个空的数据。
    还有就是测试时,使用的是正点原子的XCOM串口工具,最高支持3000K波特率,所以本程序测试时给定的波特率为3000K,这实时性还不够好吗。
    以前在校园时最常用的是9600和115200,目前看见的实用的也不过250K和500K,所以3000K够快啦。
    代码还没有完善,没做com_stop_read函数,不过也是非常简单的,我把代码贴在最后,感兴趣可以自己看下,有好的建议也可以沟通交流。

    额外的:

    安装serial时,经常理所当然的使用:

    pip install serial
    

    但是运行时会发现提示serial中没有Serial,这是因为按的不对,真正的该执行的应该是:

    pip install pyserial
    

    祝君好运,python串口玩得愉快
    代码如下:

    # coding=utf-8
    # @Time : 2020.12.19
    # @Author : QiQiuyang
    # @File : uart_manage.py
    # @note : 实现python端串口多线程实时收发
    
    import serial   #pip install pyserial
    import sys
    
    import getopt
    import threading
    
    class TUartManage(object):
        def __init__(self, com, baudrate):
            self.__com = com
            self.__baudrate = baudrate
            self.__read_flag = False
            self.data_bytes = bytearray()
            self.__com_uart = serial.Serial(port=self.__com, baudrate=self.__baudrate, timeout=0.1)
            if self.__com_uart.is_open:
                print('open ' + self.__com + ' success !!!')
    
    
        def __read_data(self):
            '''
            在线程内循环接收数据,数据发送端选用的正点原子的串口调试工具XCOM,最大支持3000K的波特率,所以
            本程序实时性实测在波特率为3000ke时接收正常。
            :return: None
            :note 数据缓存在self.data_bytes中,可由外界直接调用获取
            '''
            while self.__com_uart.isOpen() and self.__read_flag:
                if self.__com_uart.in_waiting:
                    self.data_bytes = self.__com_uart.read(self.__com_uart.in_waiting)
                    if self.data_bytes[0] == 0x7e:
                        data_end = self.data_bytes.find(0x7e, 1)
                        self.data_bytes = self.data_bytes[0:data_end+1].hex()
                        self.__com_uart.reset_input_buffer()
    
        def com_start_read(self, rx_size=1*1024*1024):
            """
            设置接收buf的size,并创建一个线程,专门用来实时接收数据
            :param rx_size: 默认设置1M的接收缓存
            :return: None
            """
            self.__com_uart.set_buffer_size(rx_size=rx_size)
            self.__read_flag = True
            read_thread = threading.Thread(target=self.__read_data)
            read_thread.setDaemon(True) #守护进程,自动运行结束退出,或者主进程结束时,自动结束
            read_thread.start()
    
        def com_stop_read(self):
            '''
            将允许读串口的标志位置False,这个操作会使read_data函数,自然结束读取数据,退出线程
            :return: None
            '''
    
            self.__read_flag = False
    
    
    
    
    if __name__ == "__main__":
        # 字典
        test_param = {"com": "com1", "baudrate": "3000000"}
    
        # 尝试获取命令行参数,c->指定的com口,b->指定的波特率,s->secret_file,t->test_file
        try:
            options, argv = getopt.getopt(sys.argv[1:], "c:b:")
        except getopt.GetoptError:
            sys.exit()
    
        # 根据命令行的参数内容,调整字典中键值对应的value
        for option, value in options:
            if option in ("-c", "--comname"):
                test_param['com'] = value
                print("com: {0}".format(test_param['com']))
    
            if option in ("-b", "--baudrate"):
                test_param['baudrate'] = value
                print("baudate : {0}".format(test_param['baudrate']))
    
        uartmanage = TUartManage(test_param["com"], test_param['baudrate'])
        uartmanage.com_start_read()
        while True:
            print(uartmanage.data_bytes)
    
    
    
    
    
    
    
    展开全文
  • 树莓派+python+打印串口数据

    千次阅读 2018-02-07 11:15:49
    python上手没两天,写一个正常的打印串口的程序耗费了我半天的时间,网上有很多关于树莓串口python小程序,多数是在串口助手这样的终端回显,而我想要树莓派时时打印出串口接收到的数据。在网上找了许多的文章,不尽...

    树莓派+python+打印串口数据

    原创 2017年02月11日 16:19:34

    python上手没两天,写一个正常的打印串口的程序耗费了我半天的时间,网上有很多关于树莓串口python小程序,多数是在串口助手这样的终端回显,而我想要树莓派时时打印出串口接收到的数据。在网上找了许多的文章,不尽人意。遇到了各种小问题。

    第一个就是python print 不换行的问题,详细自行百度。

    python2.x 版本需要在printf语句后面打逗号,换行是没有了,但是出现了时延和空格,以前的换行符变成了空格。

    所以我选择了另一种打印不换行的替代方案,sys.stdout.write() 替换print,换行和空格解决了,时延又是一个问题。

    第二个就是打印时延,让人很不爽快。

    解决办法见链接  ,python -u 运行python 程序禁用stdout缓冲即可。

    最后附上修改代码。

    [python] view plain copy
    1. # -*- coding: utf-8 -*  
    2. #python -u 启动,禁用stdout缓冲功能,不然打印有延时。    
    3. import serial    
    4. import time    
    5. import sys  
    6. # 打开串口    
    7. ser = serial.Serial("/dev/ttyUSB0"9600)    
    8. def main():    
    9.     while True:    
    10.         # 获得接收缓冲区字符    
    11.         count = ser.inWaiting()    
    12.         if count != 0:    
    13.             # 读取内容并回显    
    14.             recv =ser.read(count)   
    15. #            print recv  
    16.             sys.stdout.write(recv)  
    17.             ser.write(recv)    
    18.         # 清空接收缓冲区    
    19.         ser.flushInput()    
    20.         # 必要的软件延时    
    21.         time.sleep(0.1)    
    22.         
    23. if __name__ == '__main__':    
    24.     try:    
    25.         main()    
    26.     except KeyboardInterrupt:    
    27.         if ser != None:    
    28.             ser.close()   
    展开全文
  • 我尝试利用串口接收单片机10ms一发的一串数据数据为五个浮点数组成; 当他们都为静态的时候,比如,全为0.0,或者全为10000+的情况,无问题; 但是当数据产生变化时,数据越大,串口工具就会接收的越卡顿。 暂时...
  • 问题:目前项目处于前期模拟阶段,故使用串口调试助手进行数据的模拟传输,但是发现串口数据接收接收数据时常不完整,后来发现和程序的设置有关。 正文: 在开始之前,先给出需要使用的两款软件以及操作系统...
  • python在调用pyserial通信的时候,接收串口调试助手或者设备发送过来的HEX值,在特定位置会出现错误编码,接收到的不是十六进制数据,而是一些乱符号,' ', '!', '"', '#', '$', '%', '&', '\'', '('...
  • 问题是这样的,我用python代码向ARDUINO中传输数据的时候,只会在最初的第一次运行时向串口传输正确的字符串“openthelight”,当while循环运行结束的时候就会出现数据刷新的情况,从代码上没看出什么毛病,求大神...
  • //得到此次接收数据的长度 printf("\r\n您发送的数据为:\r\n\r\n"); for(t=0;t;t++) { USART_SendData(USART1, USART_RX_BUF[t]);//向串口发送数据 while(USART_GetFlagStatus(USART1,USART_...
  • 蓝牙模块将数据通过串口发送给wrtnode 2p,wrtnode通过ser2net服务将数据转为网络数据,可以通过监听192.168.8.1:2001实现对数据的抓取,环境为python3时通过socket编程接收收据并无问题,但是当环境为python2时出现...
  • 请教一下Python3发16进制数据问题

    千次阅读 2018-10-26 10:32:04
    就是请教一下,发16进制数据问题(Linux下python web应用通过浏览器get请求后台发送16进制数据,windows sscom接收串口数据): ser.write(b'\x5a\xa5\x06\x83\x10\x02\x01\x1d\x1d'),这样发16进制数据有什么问题...
  • 小工具--串口

    2018-04-27 19:35:00
    保存接收数据到TXT文档,主要是测试串口接收到数据,给python进行处理时的小应用(个人使用),避免长时间测试数据丢失的问题;  3.发送串口数据;  4.发送文件; 小细节:  1.串口没有打开之前,不能进行发送...
  • python 字节与字符串的转换

    千次阅读 2018-08-08 15:40:18
    在写python 串口程序时,想在窗口的文本框区域将串口每次接收到的数据能够换行显示,碰到两个问题: 1. 字节与字符串的转换; 2. 由于用wxpython做python的UI开发,文本框区域的换行显示; 先系统学习一下字节与...
  • 2>右击接收数据窗口可以进行清除; 3>右击发送窗口可以进行清除和数据转换; 4>右击发送按钮可以进行连续发送设置; 5>F2键为快捷发送; 6>本软件收发中文容易卡死,此时请断开串口从新链接。 About: 串口调试助手 ...
  • 我写了个串口接收程序,然后仿照c#地面站写了解码的程序,测试下来可以用。 我测试时飞控只用了核心板,把飞控里好多检查的代码去掉才会有数传数据发出来。然后我把cp2102 rx接到数传口上,cp2102另一头是接在...
  • serial_socket.py是转发程序,注意这里串口读取是50个全部读到才发socket,否则会有问题,刷新速度很快,但是实际更新不及时。 socket_decode.py是socket连接的另一端,用于接收和解码数传数据的。 serial_socket....
  • * __串口助手 发送16进制数据为01 02 03 ab,网关Active灯闪,数据接收中。 问题:出在串串口助手的com串口上,波特率没有匹配造成的读取空。 * python 代码时网关link灯由绿变蓝长亮,数据采集。 ``` ...
  • 通过两个USB转TTL模块 实现PC发送数据到树莓派 并且传输的中文数据正常显示说明PC端 串口调试助手树莓派接收树莓派文件创建树莓派收数据 python2.7 代码打印结果调试待补充部分 说明 本博客阐述如何通过两个USB转TTL...
  • 因为我想要快速地从我的开发板传数据到电脑,因此我尝试使用USB的视频类模式来传输...我最终的目的是利用USB快速传输任意的数据,然后电脑端能够接收串口慢了,USB的HID模式也不够快。希望可以得到大家的帮助。谢谢。
  • pyserial相关资料整理

    2021-05-14 23:25:30
    关于pyserial的基本操作 pythonserial函数_Python Serial串口基本操作(收发数据) ...1.python serial串口调试中的可能会产生的一些数据读取异常的问题 2.串口通信程序中十六进制格式发送和接收实现 3.pyt
  • 数据接收模块通过串口中断的方式实现,首先以中断的方式打开串口设备,然后每当有数据达到时,触发相应的中断回调函数,在中断回调函数里发送有数据到达的信号量,通知数据处理线程进行数据读取。 数据解包: 数据包...
  • 最近在做一个外设管理平台,用PYTHON写了一个连接管理,兼容串口和套接字的连接,然后抽象为设备统一管理。...当远端设备的接收程序是使用JAVA、PYTHON这种类型程序编写的时候,解析JSON格式一般不会有大的问题...
  • 基于LabVIEW的串口数据采集的实现及应用.pdf 基于LabVIEW的串口通信应用.pdf 基于LabVIEW的信号处理技术应用演示及实验系统设计.pdf 基于LabVIEW的倒立摆控制系统研究.pdf 基于LabVIEW的光纤傅里叶变换光谱仪数据...
  • 基于LabVIEW的串口数据采集的实现及应用.pdf 基于LabVIEW的串口通信应用.pdf 基于LabVIEW的信号处理技术应用演示及实验系统设计.pdf 基于LabVIEW的倒立摆控制系统研究.pdf 基于LabVIEW的光纤傅里叶变换光谱仪数据...
  • 基于LabVIEW的串口数据采集的实现及应用.pdf 基于LabVIEW的串口通信应用.pdf 基于LabVIEW的信号处理技术应用演示及实验系统设计.pdf 基于LabVIEW的倒立摆控制系统研究.pdf 基于LabVIEW的光纤傅里叶变换光谱仪数据...
  • 基于LabVIEW的串口数据采集的实现及应用.pdf 基于LabVIEW的串口通信应用.pdf 基于LabVIEW的信号处理技术应用演示及实验系统设计.pdf 基于LabVIEW的倒立摆控制系统研究.pdf 基于LabVIEW的光纤傅里叶变换光谱仪数据...
  • 读取以及数据接收判断 写入 总结测试博客地址: https://blog.csdn.net/grey_csdn/article/details/89343631 arduino_004_interrupt_and_timer 中断以及计数器 测试了计数器的读取 尝试做了一个调度器,观察...

空空如也

空空如也

1 2
收藏数 31
精华内容 12
关键字:

python串口接收数据问题

python 订阅