Komunikacja arduino z komputerem

Odpowiedz Nowy wątek
2017-11-13 21:42
0

Witam forumowiczów, mam pewien problem. Od pewnego czasu bawię się z arduino i przy próbie komunikacji go z moim programem konsolowym w c#. Czasem wyświetla dwa pierwsze komunikaty ale później znowu pokazuje się błąd taki jak na obrazku. Z góry dziękuje za każdą pomoc.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
namespace ArduinoBETAConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            SerialPort myport = new SerialPort()
            {
                BaudRate = 9600,
                PortName = "COM3",
                ReadTimeout = 100
            };
 
            myport.Open();
 
            while (true)
            {
                try
                {
                    Console.WriteLine(myport.ReadLine());
                }
                catch
                {
                    Console.WriteLine("NIE PYKLO");
                }
            }
        }
    }
}

A tutaj kod na arduino (tak wiem prosty :D)

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  Serial.println("ON");
  delay(1000);                       
  digitalWrite(LED_BUILTIN, LOW); 
  Serial.println("OFF");   
  delay(1000);                       
}

Monitor portu Arduino IDE, oraz błędy w visual studio są pokazane na zdjęciach w linku. Sory, że w linku ale coś nie działa mi w stawianie pomimo, że korzystam z chrome.

static.4programmers.net/uploads/attachment/5a/5a0a04e21e0b1.png
static.4programmers.net/uploads/attachment/5a/5a0a04e45ece2.png (Jeśli usunę try, catch)
static.4programmers.net/uploads/attachment/5a/5a0a04e6652b1.png
static.4programmers.net/uploads/attachment/5a/5a0a04e8c7a15.png

  • 3.png (0 MB) - ściągnięć: 4
  • 2.png (0,05 MB) - ściągnięć: 4
  • 1.png (0,01 MB) - ściągnięć: 4
  • 0.png (0,01 MB) - ściągnięć: 4
edytowany 1x, ostatnio: furious programming, 2017-11-13 21:48
Obrazki dodawaj do załączników postów – poprawione. - furious programming 2017-11-13 21:49

Pozostało 580 znaków

2017-11-13 21:47
0

Nie ustawiasz zbyt niskiego timeout'u w ustawieniach portu szeregowego?
Bo w konsoli masz 100(ms) a w arduino delay 1000(ms).

edytowany 1x, ostatnio: atmal, 2017-11-13 21:47

Pozostało 580 znaków

2017-11-13 21:48
0

Nic nie pomogło

Pozostało 580 znaków

2017-11-13 21:52
0

Musi, masz za mały czas, ustaw na 2000 i zobacz co się stanie. Oczywiście w programie na komputerze

edytowany 1x, ostatnio: Manuel.Artificer, 2017-11-13 21:53

Pozostało 580 znaków

2017-11-13 22:08
0

Po prostu wolniej wypisuje ale dalej nie działa

Pozostało 580 znaków

2017-11-13 22:11
0

Ale czy nie przypadkiem ReadTimeout w SerialPorcie, nie podaje się w Tickach? Usuń po prostu ReadTimeout, bo domyślnie jest nieskończony, i sprawdź jak to działa. Potem możesz ustawić Timeout (10 000 Tick-ów to milisekunda).

edytowany 1x, ostatnio: Bartek P, 2017-11-13 22:12
w dokumentacji jest, że w milisekundach - Manuel.Artificer 2017-11-13 22:17
wiem, ale patrząc do źródła inną rzecz można wywnioskować (https://github.com/Microsoft/referencesource/blob/master/System/sys/system/IO/ports/SerialPort.cs) EDIT: Environment.TickCount zwraca nie Ticki a milisekundy... - Bartek P 2017-11-13 22:23

Pozostało 580 znaków

2017-11-13 22:14
2

Zrób tak
Dla obiektu serialPort dodaj metodę obsługi zdarzenia

serialPort1.DataReceived += SerialPort1_DataReceived;

Definicja metody:

private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort sp = sender as SerialPort;
            if (sp != null)
            {
                string dataReceived = sp.ReadLine();
                Console.WriteLine(dataReceived);                
            }
        }

a tego TimeOut wywal

Pozostało 580 znaków

2017-11-13 22:15
0

@Bartek P:
Z MSDN

Gets or sets the number of milliseconds before a time-out occurs when a read operation does not finish.

The read time-out value was originally set at 500 milliseconds in the Win32 Communications API. This property allows you to set this value. The time-out can be set to any value greater than zero, or set to InfiniteTimeout, in which case no time-out occurs. InfiniteTimeout is the default.

Co może warto byłoby spróbować - ustawić InifiniteTimeout i mierzyć ile tak naprawdę zajmuje odebranie wiadomości bo być może coś ze strony Arduino jest nie tak.

edytowany 1x, ostatnio: atmal, 2017-11-13 22:15

Pozostało 580 znaków

2017-11-13 22:23
0

Po usunięciu nie wyswietla się nic no chyba że najpierw odpale monitor portu na arduino i po chwili wylacze nastepnie odpale program c# to wypisuje sie od razu 2/3 razy on lub off i znowu nic a gdy zamkne i odpale jeszcze raz c# to nic sie nie wyswietla do czasu gdy powtorze wlaczenia serial portu arduino.

próbowałeś tym zdarzeniem? - Manuel.Artificer 2017-11-13 22:28

Pozostało 580 znaków

2017-11-13 22:31
0

Nie działa no chyba ,że coś źle robię

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
namespace ArduinoBETAConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            SerialPort myport = new SerialPort()
            {
                BaudRate = 9600,
                PortName = "COM3 
            };
            myport.Open();
 
            myport.DataReceived += SerialPort1_DataReceived;
            void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                SerialPort sp = sender as SerialPort;
                if (sp != null)
                {
                    string dataReceived = sp.ReadLine();
                    Console.WriteLine(dataReceived);
                }
            }
        }
    }
}

Pozostało 580 znaków

2017-11-13 22:33
1

Masz metodę DataReceived w środku Main.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0