【问题标题】:Raspberry pi and arduino serial connection over usb displays USB informationRaspberry pi 和 arduino 通过 USB 串行连接显示 USB 信息
【发布时间】:2017-03-19 13:14:48
【问题描述】:

我试图使用 USB 和 pySerial 库在 Arduino 和树莓派之间进行交流。我想让多个传感器发送数据和从 pi 端发送的几个命令。我尝试使用数组发送数据并在 python(接收)端使用索引来访问单个数据通道,是否有另一种方法来完成此任务,我尝试了解“data.split(':')”,我似乎不明白它是如何工作的。有人可以告诉我一种来回传输数据的合法方法吗?

Arduino 代码:

int data[100];
int val2 = A0;
int val1 = A1;

void setup(){
  pinMode(val1, INPUT);
  pinMode(val2, INPUT);
  Serial.begin(9600);
}

void loop(){
 // individual channels of data transmitted, delya = 60 for 6 channels, f = 1/50
  while(1){
    data[0] = analogRead(val2);
    data[1] = analogRead(val1);
    data[2] = analogRead(A2);
    data[4] = analogRead(A3);
    data[5] = analogRead(A4);
    Serial.print(data[0]);
    Serial.print(":");
    Serial.print(data[1]);
    Serial.print(":");
    Serial.print(data[2]);
    Serial.print(":");
    Serial.print(data[3]);
    Serial.print(":");
    Serial.print(data[4]);
    Serial.print(":");
    Serial.print(data[5]);

    Serial.println();
    delay(60);
  }

}

Python 端:

import serial
from  Tkinter import *
import time

data = []
newData = []
next = []
root = Tk()
while True:
    ardu = serial.Serial('/dev/ttyACM0', 9600, timeout = 0.1)
    data =ardu.readline()       
    print data[0:25]

【问题讨论】:

    标签: python arduino


    【解决方案1】:

    你是对的,你需要 Python 的 split() 方法。您可以按如下方式使用它:

    Arduino 代码:

    int data[6];
    int val2 = A0;
    int val1 = A1;
    
    void setup(){
      pinMode(val1, INPUT);
      pinMode(val2, INPUT);
      Serial.begin(9600);
    }
    
    void loop(){
     // individual channels of data transmitted, delay = 60 for 6 channels, f = 1/50
      while(1){
        data[0] = analogRead(val2);
        data[1] = analogRead(val1);
        data[2] = analogRead(A2);
        data[3] = analogRead(A3);
        data[4] = analogRead(A4);
        data[5] = analogRead(A5);
        Serial.print(data[0]);
        Serial.print(":");
        Serial.print(data[1]);
        Serial.print(":");
        Serial.print(data[2]);
        Serial.print(":");
        Serial.print(data[3]);
        Serial.print(":");
        Serial.print(data[4]);
        Serial.print(":");
        Serial.print(data[5]);
    
        Serial.println();
        delay(60);
      }
    
    }
    

    Python 端:

    import serial
    
    ser = serial.Serial('/dev/ttyACM0', 9600)
    
    while True:
        line = ser.readline().decode("utf-8").strip('\n').strip('\r')  # remove newline and carriage return characters
        print "Received: '{}'".format(line)
        data = line.split(':')
        for i in range(len(data)):
            print "data[{}]".format(i), data[i]
    

    结果:

    Received: '495:916:837:37:120'
    data[0] 495
    data[1] 916
    data[2] 837
    data[3] 37
    data[4] 120
    

    说明:

    split() 从一个字符串创建一个列表,列表的元素是字符串中两对: 之间的部分,或者是开始/结束和另一个: 之间的部分。

    【讨论】:

    • 啊,我明白了,虽然很精确 :) 但是也可以使用通常的索引方法吗?
    • @PrathikGurudatt,您只能在使用 split() 后对其进行索引。如果对您有帮助,请标记为已接受。
    • 谢谢你,Morgoth - 我正在寻找代码来清理 Pi 端收到的 Arduino 打印输出 Your decode("utf-8").strip('\n').strip ('\r') 简洁地做得很好 :-) 拆分实现对我来说是一个奖励!
    猜你喜欢
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    相关资源
    最近更新 更多