Чтение с последовательного порта Arduino с использованием Go-serial - PullRequest
0 голосов
/ 13 мая 2018

У меня arduino uno с простой прошивкой, которая обеспечивает простой API через последовательный порт:

  • Команда «чтение» возвращает текущее состояние
  • Команда «вкл» устанавливает состояние «вкл»
  • Команда «выкл» устанавливает состояние «выкл»

Теперь я хочу реализовать клиент для этого устройства. Если я использую последовательный монитор Arduino IDE, этот API работает должным образом. Если я использую python с библиотекой pySerial, API работает.

Но всякий раз, когда я пытаюсь прочитать данные с последовательного порта, используя golang и go-serial, мои вызовы чтения зависают (но прекрасно работают с / dev / pts / X, созданным, например, socat)

Python-клиент

import serial
s = serial.Serial("/dev/ttyACM0")
s.write("read\n")
resp = []
char = None
while char != "\r":
    char = s.read()
    resp.append(char)
print "".join(resp)

Go клиент (зависает при вызове Read навсегда): основной пакет

import "fmt"
import "github.com/jacobsa/go-serial/serial"

func check(err error) {
    if err != nil {
        panic(err.Error())
    }
}

func main() {
    options := serial.OpenOptions{
        PortName:        "/dev/ttyACM0",
        BaudRate:        19200,
        DataBits:        8,
        StopBits:        1,
        MinimumReadSize: 4,
    }
    port, err := serial.Open(options)
    check(err)
    n, err := port.Write([]byte("read\n"))
    check(err)
    fmt.Println("Written", n)
    buf := make([]byte, 100)
    n, err = port.Read(buf)
    check(err)
    fmt.Println("Readen", n)
    fmt.Println(string(buf))
}

Код прошивки:

String inputString = "";         // a String to hold incoming data
boolean stringComplete = false;  // whether the string is complete
String state = "off";

void setup() {
    // initialize serial:
    Serial.begin(9600);
    // reserve 200 bytes for the inputString:
    inputString.reserve(200);
    pinMode(13, OUTPUT);
}

void loop() {
    // print the string when a newline arrives:
    if (stringComplete) {
        blink();
        if (inputString == "on\n") {
        state = "on";  
        } else if (inputString == "off\n") {
        state = "off";  
        } else if (inputString == "read\n") {
        Serial.println(state  );  
        }
        // clear the string:
        inputString = "";
        stringComplete = false;
    }
}


void blink() {
    digitalWrite(13, HIGH);   // set the LED on
    delay(1000);              // wait for a second
    digitalWrite(13, LOW);    // set the LED off
    delay(1000);              // wait for a second
}

void serialEvent() {
    while (Serial.available()) {
        // get the new byte:
        char inChar = (char)Serial.read();
        // add it to the inputString:
        inputString += inChar;
        // if the incoming character is a newline, set a flag so the main loop can
        // do something about it:
        if (inChar == '\n') {
        stringComplete = true;
        }
    }
}

код Python

1 Ответ

0 голосов
/ 14 мая 2018

Вы установили скорость передачи данных для функции Go lang на 19200, но в Arduino вы использовали 9600.

В коде Python скорость в бодах не установлена, поэтому она принимает значение по умолчанию 9600.

Просто установите правильную скорость в вашей программе go lang, и она должна работать.

...