Серийный монитор, когда порт используется другим приложением

Я управляю некоторыми светодиодами через последовательный порт USB, используя скрипт Tkinter/Python3x для отладки того, что, как я подозреваю, связано с аппаратной проблемой.

from tkinter import *
import serial

usbport = 'COM3'
ser = serial.Serial(usbport, 9600, timeout=1)

def init():
    print("Started")

class App:

    def __init__(self, master):

        frame = Frame(master)
        frame.pack()
        self.scale1 = Scale(master, from_=0, to=255, command=lambda ev: self.getBright(1), bd=5, bigincrement=2, length=360, width=30, label='RED')
        self.scale1.set(128)
        self.scale1.pack(side=LEFT)
        self.scale2 = Scale(master, from_=0, to=255, command=lambda ev: self.getBright(2), bd=5, bigincrement=2, length=360, width=30, label='GREEN')
        self.scale2.set(128)
        self.scale2.pack(side=LEFT)
        self.scale3 = Scale(master, from_=0, to=255, command=lambda ev: self.getBright(3), bd=5, bigincrement=2, length=360, width=30, label='BLUE')
        self.scale3.set(128)
        self.scale3.pack(side=LEFT)
        self.centre = Button(frame, text="Centre All", command=self.centre)
        self.centre.pack(side=TOP)


    def getBright(self, slider):

        if slider==1:
            brt = self.scale1.get()

        if slider==2:
            brt = self.scale2.get()  

        if slider==3:
            brt = self.scale3.get()

        ser.write(255)
        ser.write(slider)
        ser.write(brt)

    def centre(self):

        for LED in range(0, 4):

            ser.write(255)
            ser.write(LED)
            ser.write(128)

        self.scale1.set(128)
        self.scale2.set(128)
        self.scale3.set(128)


init()
root = Tk()
app = App(root)
root.mainloop()

На стороне Arduino Mega 2560 я считываю из серийного номера стартовый байт, метку светодиода & значение яркости...

int user_input[3];    
int start_byte;       
int LED;           // какой светодиод пульсировать? г=1 г=2 б=3
int brightness;
int i;               

// контакты светодиода
#define REDPIN 7
#define GREENPIN 8
#define BLUEPIN 9

void setup() 
{ 

  // Светодиодные выходы
  pinMode(REDPIN, OUTPUT);
  pinMode(GREENPIN, OUTPUT);
  pinMode(BLUEPIN, OUTPUT);

  Serial.begin(9600);
} 

void loop() 
{ 
  if (Serial.available() > 2) {

    start_byte = Serial.read();
    if (start_byte == 255) {

      for (i = 0; i < 2 ; i++) {
        user_input[i] = Serial.read();
      }

      LED = userInput[0];
      brightness = user_input[1];

      switch (LED) {

        case 1:
          analogWrite(REDPIN, brightness);
          break;

        case 2:
          analogWrite(GREENPIN, brightness);
          break;

        case 3:
          analogWrite(BLUEPIN, brightness);
          break;

      }
    }
  }
}

Теперь я хотел бы посмотреть, что на самом деле отправляется через последовательный порт в Arduino с помощью монитора последовательного порта (да, я знаю, что могу просто распечатать значения в терминале Python, это не то, о чем я прошу).

Проблема в том, что последовательный монитор Arduino заблокирован. Я предполагаю, что это проблема Windows (Win10 x64)? Кто-нибудь здесь сталкивался с этим?

, 👍1

Обсуждение

Я думаю, это совершенно нормально. Только одно приложение может использовать порт одновременно, @chrisl

Подсоедините адаптер USB к последовательному порту к любому другому серийному аппарату Меги и распечатайте там., @Juraj


1 ответ


Лучший ответ:

1

Последовательные данные могут одновременно передаваться только в одно место. Либо ваша программа Python может получать данные, либо серийный монитор может получать данные. Точно так же последовательный порт может одновременно получать данные только из одного места.

Поэтому Windows не позволяет вам делать что-то недопустимое, блокируя доступ к последовательному порту, когда его использует кто-то другой.

Это нормальная и совершенно желательная функциональность.

Самый простой вариант — просто распечатать то, что вы получаете в своей программе Python.

,

Значит, это встроенная вещь Windows? У меня нет проблем с чтением последовательного порта из нескольких приложений при использовании Raspbian., @DrBwts

Это потому, что Linux намного сложнее, чем Windows. Однако, если вы откроете порт несколько раз в Linux, только одна программа получит данные. Который из? Невозможно сказать., @Majenko

@Majenko "Какой? Невозможно сказать." Действительно, очень изысканно. ;), @DataFiddler

@DataFiddler Это зависит от многих факторов. Может быть, это будет последний подключенный. Может быть, первый. Возможно, это будет разделение 50/50. Я не знаю ответа. Какой-нибудь хакер ядра Linux мог бы, но не я. Лично я использую socat в Linux для "отбора" данных и передачи их на другое pty-устройство, если мне нужно выполнить отладку на таком уровне., @Majenko

@Majenko: Спасибо, что обратили мое внимание на socat., @DataFiddler