ARDUINO Определение связи с компьютером по юсб (ком-порту)

Старик Похабыч

★★★★★✩✩
14 Авг 2019
1,686
415
Москва
Назрел вопрос определения при старте ардуинки определить есть ли связь с компьютером или нет. На уровне setup , далее должны быть 2 варианта развития события - автономная работа или работа под управлением ПК. но это уже потом и просто.

Пока не нашел как реализовать наличие проводной связи с ПК. serial в любом случае выдает тру, вне зависимости от типа подключения питания (юсб или ноги) , при попытке получить кол-во байтов записанных write в любом случае считается, что все пишется.

Если у кого есть наметки или идеи буду благодарен
 

Wan-Derer

★★★★✩✩✩
Команда форума
31 Июл 2018
1,457
295
Москва
wan-derer.ru
@Старик Похабыч, Если под управлением ПК, значит предполагается какой-то обмен. Значит при старте Дуина должна сказать: "Я здесь!". Комп должен ответить: "Ага, управляю!"
Если не отвечает - значит не подключён или управляющая программа не работает.
 

Старик Похабыч

★★★★★✩✩
14 Авг 2019
1,686
415
Москва
Есть такой вариант, но есть желание сделать по другому, но не факт что получиться. Просто без подключения плата уходит в цикл с пониженным питанием и не вернется. Выполнит свои задачи и выключится. Можно некоторое время ждать пароль-отзыв, но я пока не думал детально о такой реализации.
Сам монитор IDE перезапускает ардуину.. пробовать processing буду. но в ней я ноль. да и с ардуино всего то 4 месяца развлекаюсь
 

Старик Похабыч

★★★★★✩✩
14 Авг 2019
1,686
415
Москва
Кое что вытанцовывается, но не совсем так, как хотелось бы.
Вот скетч, который ждет "позывного" от ком порта при подключении в течении 5 секунд, и ,если дожидается, то работает в режиме 1, иначе в режиме 0
C++:
uint32_t StartTime=0;
byte mode_work=0;
String st;

void setup() {
  Serial.begin(9600);
  StartTime=millis();
  while (millis()-StartTime<5000)
  {
       if (Serial.available() > 0) {
        st=Serial.readString();
        Serial.println(st);
        if (!st.compareTo("DENNIS")){
          mode_work=1;
        }
       }
   
  }
}


void loop() {
Ниже код для Pascal ABC, который открывает порты по мере доступности, и пишет в них "позывной" , это все черновики, пробы пера, но может кому то будет интересно. не знаю. Если не интересно, могу не делиться )
C++:
uses GraphABC,System.IO.Ports,Timers;
const
  MaxComPOrts = 10;

function TestOnePort(sp: serialport): boolean;
begin
  result := false;
end;

var
  ports: array [1..MaxComPorts] of SerialPort;
  portsGood: array [1..MaxComPorts] of boolean;
  TestComs: timer;

procedure MyDraw;
const
  DX = 10;
  DY = -15;
  HSZ = 64;
  VSZ = 21;
  VDY = 25;
begin
  LockDrawing;
  for var i := 1 to MaxComPorts do
  begin
    if portsGood[i] then
      Brush.Color := clGreen
    else Brush.Color := clRed;
    FillRect(DX, DY + i * VDY, DX + HSZ, DY + i * VDY + VSZ);
    Font.Color := clWhite;
    Font.Style := fsBold;
    Font.Size := 12;
    TextOut(DX + 4, DY + i * VDY + 1, 'COM' + i.ToString);        
  end;
  Redraw;
end;

procedure TestComPortEvent;
var
  s: string;
begin
  TestComs.Stop;
  for var i := 1 to MaxComPOrts do
  begin
    try
      portsGood[i] := true;
      ports[i].open;
      ports[i].Write('DENNIS');    
      ports[i].Close;
    except
      portsGood[i] := false;
    end;
  end;
  MyDraw;  
  TestComs.Start;  
end;


begin
  MyDraw;
  RedrawProc := MyDraw;
  for var i := 1 to MaxComPorts do
    ports[i] := new SerialPort('COM' + i.ToString);
  TestComs := new Timer(1000, TestComPortEvent);
  TestComs.Start;
end.
 

dimonSha

✩✩✩✩✩✩✩
25 Окт 2019
64
6
Украина, Харьков.
Кое что вытанцовывается, но не совсем так, как хотелось бы.
Вот скетч, который ждет "позывного" от ком порта при подключении в течении 5 секунд, и ,если дожидается, то работает в режиме 1, иначе в режиме 0
C++:
uint32_t StartTime=0;
byte mode_work=0;
String st;

void setup() {
  Serial.begin(9600);
  StartTime=millis();
  while (millis()-StartTime<5000)
  {
       if (Serial.available() > 0) {
        st=Serial.readString();
        Serial.println(st);
        if (!st.compareTo("DENNIS")){
          mode_work=1;
        }
       }
  
  }
}


void loop() {
Ниже код для Pascal ABC, который открывает порты по мере доступности, и пишет в них "позывной" , это все черновики, пробы пера, но может кому то будет интересно. не знаю. Если не интересно, могу не делиться )
C++:
uses GraphABC,System.IO.Ports,Timers;
const
  MaxComPOrts = 10;

function TestOnePort(sp: serialport): boolean;
begin
  result := false;
end;

var
  ports: array [1..MaxComPorts] of SerialPort;
  portsGood: array [1..MaxComPorts] of boolean;
  TestComs: timer;

procedure MyDraw;
const
  DX = 10;
  DY = -15;
  HSZ = 64;
  VSZ = 21;
  VDY = 25;
begin
  LockDrawing;
  for var i := 1 to MaxComPorts do
  begin
    if portsGood[i] then
      Brush.Color := clGreen
    else Brush.Color := clRed;
    FillRect(DX, DY + i * VDY, DX + HSZ, DY + i * VDY + VSZ);
    Font.Color := clWhite;
    Font.Style := fsBold;
    Font.Size := 12;
    TextOut(DX + 4, DY + i * VDY + 1, 'COM' + i.ToString);       
  end;
  Redraw;
end;

procedure TestComPortEvent;
var
  s: string;
begin
  TestComs.Stop;
  for var i := 1 to MaxComPOrts do
  begin
    try
      portsGood[i] := true;
      ports[i].open;
      ports[i].Write('DENNIS');   
      ports[i].Close;
    except
      portsGood[i] := false;
    end;
  end;
  MyDraw; 
  TestComs.Start; 
end;


begin
  MyDraw;
  RedrawProc := MyDraw;
  for var i := 1 to MaxComPorts do
    ports[i] := new SerialPort('COM' + i.ToString);
  TestComs := new Timer(1000, TestComPortEvent);
  TestComs.Start;
end.
Почему же, пишите как успехи?
 

Старик Похабыч

★★★★★✩✩
14 Авг 2019
1,686
415
Москва
Успех есть. Переменный. Научился более корректно распознавать подключенный порт в виде существует он или нет, а так же занят он или свободен со стороны ПК.
Но несколько поменялась концепция самого устройства. Изначально предполагалась связка нано+сд-карта+термодатчик+акб, устройство при включении с заданным интервалом заданное время записывает температуру на карту. А если подключено к компу, то нет - режим передачи данных. Но получалось громоздко. В результате сделал аттини85+EEPROM на 8кб+18B20+LIPO на 90ма. Все работает, но для чтения данных приходиться снимать память и переставлять на программатор на ардуино_isp , с блоком чтения памяти.
Сейчас обдумываю куда двигаться дальше. как варианты подключение устройства к нано через шлейф без изъятия памяти с общением по софтсериал. Но это несколько увеличит размеры устройства..
Со стороны ПК нет определенности в голове как должно работать. В ИДЕАЛЕ подключить устройство, запустить программу (или наоборот). программа нашла устройство, считала данные. Там же в проге возможности поменять интервалы и время работы устройства. Но не нравится именно перемещение памяти с устройства на читалку...