python提升读取速度_如何提高PySerial读取速度-程序员宅基地

技术标签: python提升读取速度  

我目前正在建造一台使用Arduino Mega2560作为主控制器的机器。Arduino连接到over-serial,获取一个命令,执行它,每1毫秒吐出一堆测量数据。我有一个运行Python的Raspberry Pi,为用户提供一个良好的图形用户界面来发送命令,并以可读的形式显示数据。

我面临的问题是:Arduino能够每毫秒吐出15字节的数据(所以这仅仅是15kbyte/s),但是我运行的代码每10毫秒只能处理大约15字节的数据,所以是1.5kB/s

当我运行cat /dev/ttyACM0 > somefile时,我很好地看到了所有数据点。

我有以下精简的Python代码# Reset Arduino by starting serial

microprocBusy = True

serialPort = serial.Serial("/dev/ttyACM0", baudrate=460800, timeout=0)

time.sleep(0.22);

serialPort.setDTR(False);

time.sleep(0.22);

serialPort.setDTR(True);

time.sleep(0.10);

logfile = open(logfilenamePrefix + "_" + datetime.datetime.now().isoformat() + '.txt', 'a')

# Bootloader has some timeout, we need to wait for that

serialPort.flushInput()

while(serialPort.inWaiting() == 0):

time.sleep(0.05)

# Wait for welcome message

time.sleep(0.1)

logfile.write(serialPort.readline().decode('ascii'))

logfile.flush()

# Send command

serialPort.write((command + '\n').encode('ascii'))

# Now, receive data

while(True):

incomingData = serialPort.readline().decode('ascii')

logfile.write(incomingData)

logfile.flush()

if(incomingData[:5] == "FATAL" or incomingData[:6] == "HALTED" or incomingData[:5] == "RESET"):

break;

elif(incomingData[:6] == "RESULT"):

resultData = incomingData;

logfile.flush()

当我运行这个程序时,第一个~350个数据点出现,然后我看到一些损坏的数据,并错过了大约2000个数据点,然后我看到另外350个左右的数据点。在此过程中,CPU使用率为100%

怎么了?PySerial是否优化得很差,或者我的代码中是否遗漏了一些错误?我可以从Python运行cat /dev/ttyACM0 > somefile,然后读取该文件,但这并不是一个很好的解决方案,不是吗?

非常感谢:)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_36249618/article/details/112957443

智能推荐

包含 videodev2.h 时 timestamp 报错的解决方法_unexpected timestamp values detected. this can occ-程序员宅基地

文章浏览阅读3.5k次。在#include <linux/videodev2.h> 后编译会报一个错:field ‘timestamp’ has incomplete type struct timespec timestamp; 2225 解决方法是在#include <linux/videodev2.h> 之前加两行:#include ..._unexpected timestamp values detected. this can occur in h.264 videos not enc

HTTP访问控制(CORS) 跨域访问_hls cors是-程序员宅基地

文章浏览阅读1.7k次。当一个资源请求一个其它域名的资源时会发起一个跨域HTTP请求(cross-origin HTTP request)。比如说,域名A(http://domaina.example)的某 Web 应用通过标签引入了域名B(http://domainb.foo)的某图片资源(http://domainb.foo/image.jpg),域名A的 Web 应用就会导致浏览器发起一个跨域 HTTP 请_hls cors是

Java实现 蓝桥杯VIP 基础练习 字符串对比_蓝桥给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的-程序员宅基地

文章浏览阅读1.1w次。问题描述  给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一:  1:两个字符串长度不等。比如 Beijing 和 Hebei  2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如 Beijing 和 Beijing  3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它..._蓝桥给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的

MySQL存储过程详解(正文)_mysql 存储正文-程序员宅基地

文章浏览阅读963次。我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的_mysql 存储正文

大数据分析工具作业task01:np.random总结及几种常见概率分布图形的绘制_np.random.random产生随机数的概率分布-程序员宅基地

文章浏览阅读1.7k次。numpy.random在生成大型样本时比纯python方式快乐一个数量级写这篇文章的原因是小米菲一直对于numpy中的伪随机数们傻傻分不清楚,再加上我的大数据分析工具老师让我们画出六种分布的图形(包括正态、指数、均匀;0-1、二项、泊松。)所以趁着这个机会恶补一下,顺便学学常用的统计图形怎么画。一个目录1.函数总结2.均匀分布2.1均匀分布np.random.rand()2.2 均匀分布的图像绘制2.3 补充——直方图hist()参数bins变量类型3. 正态分布(高斯分布)3.1 np.rand._np.random.random产生随机数的概率分布

【论文笔记】GeDi:Generative Discriminator Guided Sequence Generation_gedi: generative discriminator guided sequence gen-程序员宅基地

文章浏览阅读1.2k次。GeDi:生成式判别器引导的序列生成;可控文本生成_gedi: generative discriminator guided sequence generation

随便推点

课题组都在用的机器学习画图模板! 开放下载啦-程序员宅基地

文章浏览阅读129次。下载关注公众号AI算法与图像处理:并在公众号后台回复“绘图模板”,即可获取下载来源:机器之心神经网络画图神器 ML Visuals 正在持续更新。github上有一个名为 ML Visuals 的机器学习画图模板,该项目受到广泛关注,迄今已收获 7.2K Star。ML Visuals 专为解决神经网络画图问题设计!项目地址:https://github.com/dair-ai/ml-visua..._ml visuals下载

ctf 网络安全比赛简介_网络攻击比赛-程序员宅基地

文章浏览阅读330次。MISC(安全杂项):全称Miscellaneous。题目涉及流量分析、电子取证、人肉搜索、数据分析、大数据统计等等,覆盖面比较广。我们平时看到的社工类题目;给你一个流量包让你分析的题目;取证分析题目,都属于这类题目。主要考查参赛选手的各种基础综合知识,考察范围比较广。PPC(编程类):全称Professionally Program Coder。题目涉及到程序编写、编程算法实现。算法的逆向编写,批量处理等,有时候用编程去处理问题,会方便的多。当然PPC相比ACM来说,还是较为容易的。_网络攻击比赛

代码注释对齐_写代码时每行的注释怎么对齐-程序员宅基地

文章浏览阅读3.9k次。图1图2感觉上我们认为图2是我们想要的注释对齐的效果。但感觉是不能拿来代码实现的。所以我们需要定义什么叫注释对齐。如下图假设代码部分的长度为CL,代码到//之间的长度为Width。注释对齐实际上就是计算Width-CL,中间填充这么多个空格。那么尝试定_写代码时每行的注释怎么对齐

JS高阶技巧(深浅拷贝,节流,防抖)_uni-app js 深拷贝存在函数-程序员宅基地

文章浏览阅读335次。当JavaScript开始解释执行代码的时候,最先遇到的就是全局代码,所以它会向执行上下文栈压入一个全局执行上下文,我们用globalContext表示,并且只有当整个程序运行结束时,ECStack才会被清空,所以程序结束之前,ECStack最底部永远有个globalContext。JavaScript引擎执行是顺序执行的,但是它并不是一行一行地分析和执行代码,而是一段一段地分析和执行的。因此当我们只想改变this指向,并且不想调用这个函数的时候,可以使用bind,比如改变定时器内部的this指向。_uni-app js 深拷贝存在函数

KubeVirt备份与还原方案【翻译】_kubevirt snapshot-程序员宅基地

文章浏览阅读870次。kubevirt官方给出的的备份还原方案(思路)_kubevirt snapshot

如何自己打印计算机准考证,如何打印计算机准考证-程序员宅基地

文章浏览阅读3.1k次。打印计算机准考证的方法:首先在电脑的百度上输入全国计算机等级考试,找到其官方网站,并点击进入;然后点击在线报名,并输入自己的账号和密码点击登录按钮;最后查看报名信息界面,并点击打印准考证即可。本文操作环境:windows7系统,DELL G3电脑。可以在电脑上打开全国计算机等级考试的官方网站,选择自己所在区域登陆进入以后进行打印。登录进入所属区域的全国计算机等级考试后台以后在页面底部点击打印准考证..._pc端打印准考证

推荐文章

热门文章

相关标签