Проблема получения данных из RPi в Arduino через последовательный

Наша команда пытается отправить данные из RPi в Arduino, но происходит несколько странных вещей:

Если мы откроем последовательный монитор arduino на самом RPi, то последовательные данные будут отправлены RPi и успешно приняты Arduino.

Однако, если мы не открываем последовательный монитор arduino на RPi, последовательные данные отправляются RPi, но не принимаются Arduino.

Связь между ними осуществляется через USB-кабель.

Ниже приведены коды, реализованные на RPi (с использованием библиотеки RS232 Linux на языке C):

void *rs232t_connect(void *arg)
{
 struct RS232Connection *connect = (struct RS232Connection*)arg;

 // connect to USB port ttyACM0
 fprintf(output, "Waiting for connection on Comport ttyACM0 (24)...\n");
 while(RS232_OpenComport(connect->cport_nr, connect->bdrate, connect->mode) == 1)
     sleep(1);

 // set connected flag to signal completion of connection to main()
 connect->connected = true;
 fprintf(output, "Connection accepted.");

 return 0;
}




void *rs232t_send(void *arg)
{
 struct RS232Connection *connect = (struct RS232Connection*)arg;
 unsigned char buf[4];
 int32_t g;
 bool reconnect = false, resend = false;

 while(1)
 {
   // sample
   g = 10;

   // convert from LSB->MSB to MSB->LSB
   memset(buf, 0, sizeof buf); // clear buffer
   buf[0] = (g >> 24) & 0xFF;
   buf[1] = (g >> 16) & 0xFF;
   buf[2] = (g >> 8) & 0xFF;
   buf[3] = g & 0xFF;

   if(RS232_SendBuf(connect->cport_nr, buf, sizeof(int)) == -1)
   {
     // Print error msg if sending failed
     fprintf(output, "Disconnected\n");
   }
   else
   {
     fprintf(output, "Outgoing Message: %d\n", g); // DEBUG
     g = 0;
   }
 }
 return 0;
}

Код Arduino:

long readSerialInt() {
  long result = 0;
  long temp[4];
  if (Serial.available() >= 4) {
    digitalWrite(13, 1);
    for (int i = 0; i < 4; i++) {
      temp[i] = Serial.read();
    }
    result += temp[0] << 24;
    result += temp[1] << 16;
    result += temp[2] << 8;
    result += temp[3];
    return result;
  }
  else {
     return 0;
  }
}

Есть идеи, почему это происходит? Странно, что нам нужно открыть последовательный монитор Arduino IDE на RPi до того, как сообщение будет отправлено.

Мы посылаем данные на Arduino. Однако Arduino не обнаруживает сообщений, которые мы ему посылаем (он не выполнял никаких действий/не зажигал ни одного светодиода).

Спасибо

, 👍0

Обсуждение

Есть ли еще код Arduino? Он не выглядит полным., @Dave X

`последовательные данные отправляются RPi, но не принимаются Arduino.- откуда ты знаешь, что его посылают? Возможно, отсутствие последовательного монитора на открытом Pi влияет на то, как он отправляет данные на USB-порт., @Nick Gammon

@nick-gammon я вижу свое исходящее сообщение в C, что означает, что при отправке данных не возникло ошибки., @Doe Joe

@dave-x полный код длиной в тысячи строк, и только этот метод используется в цикле для прослушивания того, что я посылаю, @Doe Joe

temp = Serial.read(); конечно же, нет. Вы имеете в виду: temp [i] = Serial.read();? - трудно отлаживать код, который на самом деле не является тем, что вы используете., @Nick Gammon

`я вижу свое исходящее сообщение в С "- как вы видите исходящие сообщения"в С"? Я спрашиваю, действительно ли сообщение исходит от Пи. А не от того, думает ли ваша программа, что она его посылает., @Nick Gammon

@NickGammon ошибка при публикации! отредактировано в оригинальном посте. я никак не могу сказать, действительно ли он "отходит от Пи", когда библиотечный метод не возвращает -1, что указывает на ошибку. Единственный способ проверить-увидеть, как мигает свет в самом Arduino, но в нашем случае свет не мигал. продолжим тестирование еще раз, @Doe Joe

Что это за код, который вызывает readSerialInt()? Похоже, что если в буфере нет хотя бы 4, процедура вернется без указания. Можете ли вы подключить Arduino к другим отправителям/Pi к другим получателям, чтобы определить, является ли неправильное поведение в одном конце или в другом?, @Dave X

Нет ничего странного в том, что открытие последовательного монитора заставляет его работать - вы не показываете, как пытаетесь настроить последовательный порт, но, скорее всего, вы пропустили ключевую настройку, так что она работает только в том случае, если запуск последовательного монитора предварительно настроил для вас недостающую., @Chris Stratton


1 ответ


0

Проблема может быть связана с вашим кодом, особенно с функцией открытия порта. Попробуйте это в Python 3 и посмотрите, работает ли это.

import serial, time

ser = serial.Serial('/dev/tty/ACM0', 9600, timeout=1)

while ser.isOpen():
    try:
        ser.write(b'Hello')
        time.sleep(0.1)
        print('Received: ')
        while ser.inWaiting():
            print(str(ser.read(), encoding='ascii'), end='')
        print()
    except KeyboardInterrupt:
        ser.close()

Сторона Arduino:

void setup(){
  Serial.begin(9600);
}

void loop(){
  while (Serial.available())
    Serial.write(Serial.read())
}

Грубо, но это намного проще, чем ваша программа, и поможет вам изолировать проблему.

,