- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对物联网领域还很陌生。我正在设置一个带有 teensy 的传感器,用于读取其数据并使用串行通信传输到系统,在系统中我使用 python 读取数据并将其存储到数据库中。
我面临的问题是,当我使用arduino串行监视器检查我的程序时,我得到疯狂的采样速度,例如在40毫秒内完成10k读数但是当我尝试使用python读取相同的程序,它甚至不会给我超过每秒1000个读数,而且如果没有数据库代码,它也只能读取200个每秒采样数。有什么方法可以提高采样率,或者我是否必须设置任何额外的参数以通过串行通信?
这是我的 teensy 代码:
int i;
elapsedMillis sinceTest1;
void setup()
{
Serial.begin(2000000); // USB is always 12 Mbit/sec
i = 0;
delay(5000);
Serial.println("Setup Called");
Serial.flush();
}
void loop()
{
if (i == 0 || i == 500000)
{
Serial.println(sinceTest1);
}
Serial.println(i);
//Serial.println(Serial.baud());
i++;
}
对于Python:
import serial
import pymysql
from datetime import datetime
import time
import signal
import sys
class ReadLine:
def __init__(self, s):
self.buf = bytearray()
self.s = s
def readline(self):
i = self.buf.find(b"\n")
if i >= 0:
r = self.buf[:i+1]
self.buf = self.buf[i+1:]
return r
while True:
i = max(1, min(2048, self.s.in_waiting))
data = self.s.read(i)
i = data.find(b"\n")
if i >= 0:
r = self.buf + data[:i+1]
self.buf[0:] = data[i+1:]
return r
else:
self.buf.extend(data)
ser = serial.Serial(
port='COM5',\
baudrate=2000000,\
#baudrate=9600,\
#parity=serial.PARITY_NONE,\
#stopbits=serial.STOPBITS_ONE,\
#bytesize=serial.EIGHTBITS,\
#timeout=0
)
print("connected to: " + ser.portstr)
count=1
#this will store the line
line = []
#database connection
connection = pymysql.connect(host="localhost", user="root", passwd="", database="tempDatabase")
cursor = connection.cursor()
checker = 0
rl = ReadLine(ser)
while True:
time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(time)
print(checker)
print(rl.readline())
insert1 = ("INSERT INTO tempinfo(value,test,counter) VALUES('{}','{}','{}');".format(33.5, time,checker)) #.format(data[0])
insert2 = ("INSERT INTO urlsync(textvalue,sync) VALUES('http://www.myname.com/value.php?&value={}&time={}',0);".format(33.5,time)) #.format(data[0])
cursor.execute(insert1)
cursor.execute(insert2)
connection.commit()
checker += 1
connection.close()
time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(time )
ser.close()
P.S:每秒 1000 个样本是我不使用数据库命令时获得的速率,包括它们,我每秒仅获得大约 250 个样本。
如有任何帮助或建议,我们将不胜感激,谢谢。
最佳答案
首先,这是个好问题。您面临的问题充满了学习机会。
让我们一项一项地进行:
-您现在可以了解微 Controller 和计算机之间的区别了。最基本形式的微 Controller (如果您正在运行裸机代码,即使它不是非常高效的代码,例如在 Arduino 上)只会做一件事,特别是当它与硬件相关时(例如读取或写入 UART) )它会非常有效地完成它。另一方面,在台式计算机上,您会同时运行一层又一层的任务(操作系统后台任务、更新屏幕等等)。由于许多事情同时发生,如果不确定优先级,就很难准确预测到底会发生什么以及何时发生。因此,不仅是您的 Python 代码在运行,还会有更多的事情出现并中断您的用户任务流程。如果您希望以稳定(或至少可预测)的速度从 UART 缓冲区读取数据,那么您目前使用的架构永远不会发生这种情况。
-即使你设法将操作系统精简到最低限度,终止所有进程,进入没有任何图形的终端......你仍然必须处理你在自己的 Python 上所做的事情的不确定性代码(这就是为什么您会看到 Arduino 串行监视器具有更好的性能,它除了从缓冲区中删除数据之外不执行任何操作)。在 Python 代码中,您按顺序从端口读取数据,尝试查找特定字符(换行符),然后将读取的数据附加到列表中。如果您想提高性能,您需要只读取数据并将其存储以供离线处理,或者查看多线程(如果您的程序有一个线程专用于仅从缓冲区读取并且您这样做)在单独的线程上进一步处理可以显着提高吞吐量,特别是如果您设置正确的优先级)。
-最后,但实际上,最重要的是,您应该问自己:我真的需要以 2 Mbps 的速度从传感器读取数据吗?如果答案是肯定的,并且您的传感器不是摄像机,那么恐怕您需要退后一步,看看以下概念:传感器带宽和动态响应。完成此操作后,下一个问题是:您的传感器更新其输出的速度有多快?为什么?这个更新率有意义吗?我可以在这里给你一些引用。首先,假设您有一个温度传感器来读取和记录 toastr 中的温度。如果 toastr 中的温度以每分钟 10 摄氏度甚至每秒 100 度的速度变化,以 1 MHz(每秒 100 万个读数)对传感器采样值是否有意义?您的传感器是否能够做出如此快的 react (动态响应发挥作用)?我的猜测:可能不会。许多工业设备集成了数十个传感器来控制关键流程并通过 1.5 Mbps 链路(例如 Profibus 的相当标准)发送所有数据。
关于python - 使用python在teensy bord和系统之间进行串行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59103816/
我开始摆弄 Teensy 2,并学习 C 代码。目前我正在尝试弄清楚如何将引脚设置作为输入。我的代码如下: #include #include #include "usb_debug_only.h
我以前从未在StackOverflow上问过这种问题,我想知道您是否可以帮助我,因为它有点“含糊”。 我必须设计一个项目,该项目使用Teensy(简单的ARM平台)通过SPI从IR摄像机(Flir,分
我目前正在使用 Arduino IDE 为我的 Teensy 编写一个库应用程序,到目前为止,它已经够直接了。然而,我遇到了一些奇怪的编译错误,我似乎无法理解。我的库包括众所周知的 IRRemote
我在尝试通过 USB 在 teensy 和 Raspberry Pi3 之间进行通信时遇到了一些问题。 当我发送 unsigned int 时,我收到所有包含字节值 13 的数字的错误数字,该字节已更
我在 Arduino/Teensy 环境中有一个 C++ 类,它在“.h”文件中定义。在“.cpp”文件中,我试图用一些代码进行“新放置”。我收到以下错误: oscillator.h:17: erro
我正在尝试为 Teensy 编写一个程序,将其用作键盘。我希望它根据输入打印出某些字符串,但有些字符串相当长。我知道对于 Arduino IDE,有一个简单的 Keyboard.print() 函数可
我正在尝试将我在 Arduino Mega 上创建的程序移植到 Teensy 3.6 上。我使用我发现的一段代码对音频信号进行采样,然后对其运行快速傅里叶变换,但现在我正在移植它,Teensy 不接受
我已经设法通过串口从我的 arduino (Uno) 写入我的 Raspberry Pi 3。 如果我在 pi 端使用相同的 python 脚本,在 arduino 端使用相同的 Sketch,但使用
我正在使用 Teensy Atmega32u4 的标准库实现 PID 控制。我的控制变量是PWM信号。我的过程变量是直流电机的当前角度位置,该电机与 10kohm 电位器连接,电位器的代码可读取 0
我有几个旨在在多个 MCU 上运行的 Github OSS 托管库,我希望设置 Travis 以便自动构建和测试它们(如果可能)。我进行了多次搜索,发现了几种不同的方法,但似乎没有一种令人满意。 一个
我正在尝试使用从 Teensy 3.2 接收到的 Python (PyQtGraph) 尽快绘制数据,该 Teensy 3.2 通过串行通信发送模拟数据。该代码可以充分绘制更高频率的测试波形(约 5k
在 Arduino C+ 中,我想在使用 32 位签名 time_t 类型时避免 2038 年溢出问题,因此我想专门使用 Time.h 来自 Teensy(或 TimeLib.h;我正在 Arduin
我正在尝试从我的覆盆子 PI 与一个青少年(一个可以假装为初学者的鼠标和键盘的 arduino)交流。 我想接收有关 arduino 的信息,并根据该信息移动鼠标。 在 arduino 方面,我制作了
我正在为我的音乐学位做最后的项目(这个想法是探索与电子乐器交互的替代输入方法),我正在使用 Teensy 3.2 和 Adafruit STMPE610 组合一个基于触摸屏的合成器。我最初计划使用基于
我用 C 创建了一些简单的代码来更改输出的占空比,我正在尝试将其转换为汇编,以便我可以在那里编辑它并提高效率。然而,该代码是为连接到 Teensy 2.0 的 Atmega32U4 编写的,每当我尝试
我是一名优秀的程序员,十分优秀!