读取串口数据并保存为.csv Python

问题描述 投票:0回答:2

我在 python 脚本中成功读入并打印了一些串行端口数据。 我在使用什么工具/功能将串行端口数据更改为表格或连续附加到 .csv 时遇到困难。 因此,在花了很多时间在堆栈溢出和其他网站上研究有关串行端口和 python 的所有内容之后,我正在伸出援手,因为我不知道下一步要采取什么步骤,而且我找不到有助于回答我的问题的信息。

这是我到目前为止的脚本:

ser = serial.Serial('com4',
                    baudrate=38400,
                    timeout=1,
                    parity=serial.PARITY_NONE,
                    stopbits=serial.STOPBITS_ONE,
                    bytesize=serial.EIGHTBITS)

while True:
    rawdata = (ser.readline().decode('ascii'))
    print(rawdata)

好的......太棒了,我们在控制台中打印了传感器数据,如下所示:

$PDLMA,+11.91,+20.7,-0.1,-0.4*6C

$PDLMH,134829.844,+2644.8,+81.46,+3094.7,+21.99*6F

$PDLM1,134829.844,+1824.1,+127.69,+3276.7,+36.82*26

现在传感器数据的结构如下:

$PDLMH  134829.844  2644.8  81.46   3094.7  21.99   *6F
       Hhmmss.sss   HCP05   HCPI    PRP05   PRP05I  Checksum
$PDLM1  134829.844  1824.1  127.69  3727.7  36.82   *26
       Hhmmss.sss   HCP10   HCP10I  PRP10   PRP10I  Checksum
$PDLMA  11.91    20.7      -0.1     -0.4        
      Voltage  Temperature  Pitch   Roll

现在我的目标是让最终输出看起来像这样:

Time HCP05 HCP05I PRP05 PRP05I HCP10 HCP10I PRP10 PRP10I Voltage Temp Pitch
(now) data   data  data   data  data   data  data   data    Data Data  Data

那么我应该怎么做才能将串行数据转换为我需要的数据并不断读入数据呢? 我尝试过数据框、列表等,但显然我在这里遗漏了一些东西。 在 .csv 输出文件中,我预计我们的用例中平均约有 120000 行数据。

今天的新手。

python parsing serial-port real-time sensors
2个回答
0
投票

我通过以下代码实现了我想要的输出:

 while dser.inWaiting() == 0:
            pass
        NMEA1 = dser.readline().decode("ascii")
        while dser.inWaiting() == 0:
            pass
        NMEA2 = dser.readline().decode("ascii")
        while dser.inWaiting() == 0:
            pass
        NMEA3 = dser.readline().decode("ascii")
        while dser.inWaiting() == 0:
            pass
        NMEA4 = dser.readline().decode("ascii")
        while dser.inWaiting() == 0:
            pass
        NMEA1_array = NMEA1.split(',')
        NMEA2_array = NMEA2.split(',')
        NMEA3_array = NMEA3.split(',')
        NMEA4_array = NMEA4.split(',')
        if NMEA1_array[0] == '$PDLMH':
            HCP05 = NMEA1_array[2]
            PRP05 = NMEA1_array[4]
        if NMEA1_array[0] == '$PDLM1':
            HCP10 = NMEA1_array[2]
            PRP10 = NMEA1_array[4]
        if NMEA1_array[0] == '$PDLM2':
            HCP20 = NMEA1_array[2]
            PRP20 = NMEA1_array[4]
        if NMEA1_array[0] == '$PDLMA':
            Voltage = NMEA1_array[1]
            Temperature = NMEA1_array[2]
            Pitch = NMEA1_array[3]
            Roll = NMEA1_array[4].partition("*")[0]
        if NMEA2_array[0] == '$PDLMH':
            HCP05 = NMEA2_array[2]
            PRP05 = NMEA2_array[4]
        if NMEA2_array[0] == '$PDLM1':
            HCP10 = NMEA2_array[2]
            PRP10 = NMEA2_array[4]
        if NMEA2_array[0] == '$PDLM2':
            HCP20 = NMEA2_array[2]
            PRP20 = NMEA2_array[4]
        if NMEA2_array[0] == '$PDLMA':
            Voltage = NMEA2_array[1]
            Temperature = NMEA2_array[2]
            Pitch = NMEA2_array[3]
            Roll = NMEA2_array[4].partition("*")[0]
        if NMEA3_array[0] == '$PDLMH':
            HCP05 = NMEA3_array[2]
            PRP05 = NMEA3_array[4]
        if NMEA3_array[0] == '$PDLM1':
            HCP10 = NMEA3_array[2]
            PRP10 = NMEA3_array[4]
        if NMEA3_array[0] == '$PDLM2':
            HCP20 = NMEA3_array[2]
            PRP20 = NMEA3_array[4]
        if NMEA3_array[0] == '$PDLMA':
            Voltage = NMEA3_array[1]
            Temperature = NMEA3_array[2]
            Pitch = NMEA3_array[3]
            Roll = NMEA3_array[4].partition("*")[0]
        if NMEA4_array[0] == '$PDLMH':
            HCP05 = NMEA4_array[2]
            PRP05 = NMEA4_array[4]
        if NMEA4_array[0] == '$PDLM1':
            HCP10 = NMEA4_array[2]
            PRP10 = NMEA4_array[4]
        if NMEA4_array[0] == '$PDLM2':
            HCP20 = NMEA4_array[2]
            PRP20 = NMEA4_array[4]
        if NMEA4_array[0] == '$PDLMA':
            Voltage = NMEA4_array[1]
            Temperature = NMEA4_array[2]
            Pitch = NMEA4_array[3]
            Roll = NMEA4_array[4].partition("*")[0]
        if () is not None:
            return (float(HCP05), float(PRP05), float(HCP10),
                    float(PRP10), float(HCP20), float(PRP20),
                    float(Voltage), float(Temperature), float(Pitch),
                    float(Roll))

不确定这是否是最好的结果,但它现在正在发挥作用。


0
投票

https://github.com/shuhain/serial-data-logger

串行数据记录器

该项目是一个开源串行数据记录器,它从串行 USB 端口读取数据并将其记录到带有时间戳(包括毫秒)的 CSV 文件中。用户可以使用键盘快捷键保存或放弃数据。该项目旨在协助串行通信工作,包括 Arduino 项目和类似的嵌入式系统设置。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.