使用python实现teensy bord与系统之间的串行通信
我是物联网领域的新手。我正在设置一个带有teensy的传感器,用于读取数据,并使用串行通信将数据传输到系统,在系统中,我使用python读取数据并将其存储到数据库中 我面临的问题是,当我使用arduino串行监视器检查我的程序时,我获得了疯狂的采样速度,比如10k读数在40毫秒内完成,但当我尝试使用python读取同一程序时,它甚至每秒给我的读数不超过1000次如果没有数据库代码,它每秒只能读取200个样本。是否有任何方法可以提高此采样率,或者我必须为通过串行通信设置任何额外参数 以下是我的teensy代码:使用python实现teensy bord与系统之间的串行通信,python,arduino,serial-port,pyserial,teensy,Python,Arduino,Serial Port,Pyserial,Teensy,我是物联网领域的新手。我正在设置一个带有teensy的传感器,用于读取数据,并使用串行通信将数据传输到系统,在系统中,我使用python读取数据并将其存储到数据库中 我面临的问题是,当我使用arduino串行监视器检查我的程序时,我获得了疯狂的采样速度,比如10k读数在40毫秒内完成,但当我尝试使用python读取同一程序时,它甚至每秒给我的读数不超过1000次如果没有数据库代码,它每秒只能读取200个样本。是否有任何方法可以提高此采样率,或者我必须为通过串行通信设置任何额外参数 以下是我的te
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个样本。
非常感谢您的任何帮助或建议。首先,很好的问题。你面临的问题充满了学习机会 让我们一个接一个地说: -您现在可以理解微控制器和计算机之间的区别了。最基本形式的微控制器(如果您运行的是裸机代码,即使它不是非常有效的代码,比如Arduino)只会做一件事,特别是当它与硬件相关时(比如读或写UART),它会非常有效。另一方面,在台式计算机上,一层层的任务同时运行(操作系统后台任务、更新屏幕等等)。由于许多事情同时发生,如果你不确定优先级,那么很难准确地预测将发生什么以及何时发生。因此,不仅仅是您的Python代码正在运行,还会有更多的事情出现并中断您的用户任务流。如果您希望以稳定(或至少可预测)的速度从UART缓冲区读取数据,那么目前使用的体系结构永远不会出现这种情况 -即使你设法将你的操作系统剥离到最低限度,杀死所有进程,在一个没有任何图形的终端上运行。。。您仍然需要处理在自己的Python代码上执行的操作的不确定性(这就是您在Arduino串行监视器上看到的更好的性能,它除了从缓冲区中删除数据之外什么都不做)。在Python代码中,您从端口顺序读取数据,尝试查找特定字符(换行符),然后将读取的数据附加到列表中。如果您想提高性能,您需要读取数据并将其存储以进行脱机处理,或者查看多线程处理(如果您的程序有一个线程专门用于从缓冲区读取数据,并且您在一个单独的线程上执行进一步的处理,则可以显著提高吞吐量,尤其是在正确设置优先级的情况下)
-最后,但实际上最重要的是,你应该问自己:我真的需要以2 Mbps的速度从传感器读取数据吗?如果答案是肯定的,并且你的传感器不是摄像机,恐怕你需要后退一步,看看以下概念:传感器带宽和动态响应。完成后,下一个问题是:关于is:您的传感器更新其输出的速度有多快?为什么?更新速度有意义吗?我可以在这里为您提供一些参考。首先,假设您有一个温度传感器来读取和记录烤箱中的温度。以1 MHz(每秒100万次读数)的频率从传感器中采样值有意义吗如果烤箱中的温度以每分钟10摄氏度甚至每秒100摄氏度的速度变化?您的传感器是否能够反应如此之快(以至于其动态响应发挥作用)?我猜:可能不会。许多工业设备集成了几十个传感器来控制关键过程,并通过1.5 Mbps的链路发送所有数据(例如,Profibus的标准配置).感谢您提供了非常丰富的信息,我了解了阅读部分的概念。因此,如果我将系统改为raspberry pi,只运行一个python代码,它会提高输出吗?此外,我确实需要跟上这个速度,所以我将尝试运行一个高优先级的程序线程,专门用于读取数据另外,C++库比Python快,或者两者都给出几乎相同的输出,我也学习不同的库,看看可以改进什么。哦,对于波特率,因为它是TENSIY,所以它在发送方没有太大的不同,因为TENSIY发送的是12 Mbps。我只是我。在接收器端进行ddling,看看是否有很大的不同。我将尝试在系统中执行多线程来检查结果。不客气。我认为即使使用Python,您也应该能够获得完整的速率,但这在很大程度上取决于您的系统配置(Linux版本、加载方式等)。使用Python,我可以获得高达1.5 Mbps的速度,但它不在RPi上。谢谢,请您指导我阅读与之相关的教程或信息性文章,或者如果可能的话,用文字写下场景,例如我可以使用什么东西或采取什么预防措施来获得系统或RPi的最大输出。谢谢这里有很多资源,您可以启动在这里,请看,例如,使用搜索引擎。如果我发现有用的东西,我会发布更多的链接。