gpt4 book ai didi

python - 使用python在teensy bord和系统之间进行串行通信

转载 作者:行者123 更新时间:2023-12-01 06:49:10 24 4
gpt4 key购买 nike

我对物联网领域还很陌生。我正在设置一个带有 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com