이 웹 사이트의 지침을 성공적으로 따랐습니다.
http://www.doctormonk.com/2012/04/raspberry-pi-and-arduino.html
웹 사이트에서 지정한대로 pi와 내 arudino mega 사이의 커뮤니케이션을 얻을 수있었습니다.
그러나 LED가 깜박이는 횟수를 나타내는 정수를 보내는 대신 ASCII 텍스트를 다음과 같이 보내려고합니다.
파이에서 arduino로 “MOVE 5 METERS FORWARD”, “TURN LEFT”, “MOVE 10 METERS BACKWARD”.
다음 코드를 작성했습니다.
char inData[64];
char inChar=-1;
void setup(){
Serial.begin(9600);
Serial.begin("Waiting for Raspberry Pi to send a signal...\n");
}
void loop(){
byte numBytesAvailable= Serial.available();
// if there is something to read
if (numBytesAvailable > 0){
// store everything into "inData"
int i;
for (i=0;i<numBytesAvailable;i++){
inChar= Serial.read();
inData[i] = inChar;
}
inData[i] = '\0';
Serial.print("Arduino Received: ");
Serial.println(inData);
}
}
Arduino Mega 2560에 위의 코드를 성공적으로 플래시했습니다.
Raspberry Pi와 콘솔에서 파이썬 터미널로 전환했습니다.
import serial
ser = serial.Serial('/dev/ttyACM1',9600)
ser.write("MOVE")
Arduino의 Serial Monitor에 표시되는 내용은 다음과 같습니다.
Arduino Received: M
Arduino Received: O
Arduino Received: V
Arduino Received: E
그러나 내가 원하는 것은 :
Arduino Received: MOVE
모든 문자를 inData 버퍼로 가져 오기 위해 위의 코드를 어떻게 변경합니까?
답변
문제는 Arduino가 너무 빨리 루핑되어 if (numBytesAvailable > 0)
직렬 포트를 통해 도착하는 각 문자 사이에서 여러 번 라인 을 실행한다는 것 입니다. 따라서 캐릭터가 도착하자마자 캐릭터를 잡고 0에서 1로 반복하며 단일 문자를 인쇄합니다.
파이썬 프로그램의 각 명령 뒤에 줄 끝 문자 ( ‘\ n’)를 보내야합니다. 그런 다음 Arduino 코드가 수신하는 각 문자를 버퍼링하고 줄 끝 문자를 수신 한 후에 만 메시지에 대해 조치를 취하십시오.
따라서 파이썬 코드를 변경하면 다음과 같이 줄 끝 문자를 보냅니다.
import serial
ser = serial.Serial('/dev/ttyACM1',9600)
ser.write("MOVE\n")
그러면 Arduino 코드는 다음과 같습니다.
// Buffer to store incoming commands from serial port
String inData;
void setup() {
Serial.begin(9600);
Serial.println("Waiting for Raspberry Pi to send a signal...\n");
}
void loop() {
while (Serial.available() > 0)
{
char recieved = Serial.read();
inData += recieved;
// Process message when new line character is recieved
if (recieved == '\n')
{
Serial.print("Arduino Received: ");
Serial.print(inData);
inData = ""; // Clear recieved buffer
}
}
}
답변
파이썬 스크립트가 4 바이트를 전송하고, M
, O
, V
,와 E
. Arduino는 이것이 단일 문자열이라는 것을 어떻게 알 수 있습니까? 파이썬 코드는 다음과 같습니다.
ser.write("MOVE")
인 완전히 동일한 행
ser.write("MO")
ser.write("VE")
아두 이노의 관점에서. 직렬 포트는 문자열이 아닌 문자를 전송합니다.
코드에서 Arduino는 빠르므로 (9600 보드 속도와 비교할 때) 호출 할 때마다 Serial.available()
4 문자 중 하나만 볼 수 있습니다. 그것이 당신이 한 결과를 얻은 이유입니다.
해야 할 일은 문자열을 구분하는 방법, 즉 파이썬에서 문자열을 표시하여 Arduino가 수신 하는 개별 문자 를 문자열의 고급 개념에 추가 할 수 있도록하는 것 입니다.
줄을 사용하는 것은 간단합니다 : 줄 바꿈 문자 ( '\n'
)로 끝나는 모든 문자열을 보냅니다 . Arduino에서 문자를 읽고 문자열에 추가하십시오. 가 보이면 '\n'
문자열이 끝나서 인쇄 할 수 있습니다.
답변
if(Serial.available() > 0) {
str = Serial.readStringUntil('\n');
Serial.println(str);
위 코드는 Pi와 Arduino 사이의 연결에서 완벽하게 작동합니다.
답변
.readline
대신에 사용.read
나는 같은 문제가 있었고 이것이 바로 고쳤다. 이것이 도움이 되었기를 바랍니다!
답변
이것이 첫 번째 예에서 내가 한 방법입니다.
String readString;
void setup()
{
Serial.begin(9600); // initialization
}
void loop()
{
char incomingByte;
while (Serial.available() > 0)
{
delay(10); // if the data came
incomingByte = Serial.read(); // read byte
//Serial.println(incomingByte);
readString += incomingByte;
}
if(readString != "")
{
Serial.print("arduino recived this : ");
Serial.println(readString);
}
readString = "";
}