Передача сериала из Raspberry в Arduino USB HID

Я пытаюсь передать данные из приложения tkinter на RPi, на Arduino Leonardo, настроенный как устройство USB HID, затем на компьютер с Arduino, используя keyboard.write(), но не все данные попадают на компьютер-получатель.

На Пи запущено приложение tkinter, и Пи подключен к загрузочным ячейкам и ультразвуковым датчикам, которые регистрируют вес и размеры посылок. Значения размещаются в виде дерева tkinter. Это все работает нормально. Я подключил Pi к Arduino Leonardo через последовательный порт (GPIO), arduino настроен как USB HID-устройство. Я хочу, чтобы значения из древовидного представления на pi передавались в arduino, а затем передавались (USB HID) на подключенный компьютер. Я почти получил это работает, но не все данные передаются, он остановится через несколько символов. Мне нужно передать TAB и INSERT на принимающий компьютер, поэтому я посылаю строки "T" и "I" из Raspberry, а затем "конвертирую" их в значения HEX на Arduino.

И серийный, и USB HID являются новыми для меня, поэтому я не уверен, правильно ли я их настроил... Есть идеи?

Этот код работает на Raspberry Pi:

x = kolliTree.get_children()
    if x:
       count = len(x) 
       for i in x:
           a = str(kolliTree.item(i)["values"][0])
           dX = str(kolliTree.item(i)["values"][1])
           dY = str(kolliTree.item(i)["values"][2])
           dZ = str(kolliTree.item(i)["values"][3])
           w = str(kolliTree.item(i)["values"][4])
           kolli = ["T", a, "T", dX, "T", dY, "T", dZ, "T", w, "T", "I"]
           for i in kolli:
               leonardo.write(i.encode("latin1"))

Это цикл на Arduino:

void loop() {

  if (Serial1.available() > 0) {
    byte inChar = Serial1.read();
    if (inChar == 84) {
      Keyboard.write(0xB3);
    }
    else if (inChar == 73) {
      Keyboard.write(0xD1);
    }
    else {
      Keyboard.write(inChar);
    }
    delay(10);

1 ответ

Попробуйте отправить несколько символов ASCII на Pi, чтобы сэкономить время на вкладке и вводить команды. Arduino и большинство языков имеют встроенные функции для преобразования числовых значений в символы ASCII. Вы можете назначить постоянное целое число на основе ссылки ниже и вызвать ее, как во второй ссылке ниже.

Если некоторые данные проходят, но не все, дважды проверьте скорость передачи. Также проверьте, не передаются ли значения с заполнением вокруг них, например, пробелами на переднем или заднем конце. Может быть полезно попытаться принудительно преобразовать тип данных на принимающей стороне, чтобы убедиться, что вы не получаете int, когда ожидаете строку (например).

Надеюсь это поможет!

http://www.asciitable.com/

https://www.instructables.com/id/Converting-integer-to-character/

Другие вопросы по тегам