Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python实现teensy bord与系统之间的串行通信_Python_Arduino_Serial Port_Pyserial_Teensy - Fatal编程技术网

使用python实现teensy bord与系统之间的串行通信

使用python实现teensy bord与系统之间的串行通信,python,arduino,serial-port,pyserial,teensy,Python,Arduino,Serial Port,Pyserial,Teensy,我是物联网领域的新手。我正在设置一个带有teensy的传感器,用于读取数据,并使用串行通信将数据传输到系统,在系统中,我使用python读取数据并将其存储到数据库中 我面临的问题是,当我使用arduino串行监视器检查我的程序时,我获得了疯狂的采样速度,比如10k读数在40毫秒内完成,但当我尝试使用python读取同一程序时,它甚至每秒给我的读数不超过1000次如果没有数据库代码,它每秒只能读取200个样本。是否有任何方法可以提高此采样率,或者我必须为通过串行通信设置任何额外参数 以下是我的te

我是物联网领域的新手。我正在设置一个带有teensy的传感器,用于读取数据,并使用串行通信将数据传输到系统,在系统中,我使用python读取数据并将其存储到数据库中

我面临的问题是,当我使用arduino串行监视器检查我的程序时,我获得了疯狂的采样速度,比如10k读数在40毫秒内完成,但当我尝试使用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个样本。


非常感谢您的任何帮助或建议。

首先,很好的问题。你面临的问题充满了学习机会

让我们一个接一个地说:

-您现在可以理解微控制器和计算机之间的区别了。最基本形式的微控制器(如果您运行的是裸机代码,即使它不是非常有效的代码,比如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的最大输出。谢谢这里有很多资源,您可以启动在这里,请看,例如,使用搜索引擎。如果我发现有用的东西,我会发布更多的链接。