Keresés

Új hozzászólás Aktív témák

  • joysefke

    veterán

    válasz t-shirt #8654 üzenetére

    Én úgy értettem a dolgot, hogy a gép kezdi az üzenetváltást, és a PC szemszögéből mindig
    fogadás-írás-fogadás-írás stb a sorrend. Itt a PC a szerver és ha ezt a feladatot kiszervezed egy külön threadbe akkor nyugodtan lehet blokkolni azt a threadet a munkagépre történő várakozással. Persze ahogy fölöttem írták, nem ártana ide sem egy timeout...

    Ha blokkoló olvasással oldod meg a dolgot, akkor valahogy így nézhet ki a dolog.
    (sosem volt serial portal dolgom és ezt amit válaszoltam sem tudom futtatni)

    Indítasz egy threadet amely minden munkacikus elején ellenőrzi, hogy szabad-e tovább futnia, ha nem, akkor rendezetten kilép. Olvas-ír-olvas-ír amíg el nem fogynak a fo_tomb-ből a parancsok.

    A main() -thread nincsen blokkolva egészen a serverThread.Join()-ig Ennél a pontnál bevárja a serverThread-et. ha a main()-en belül a serverThread befejezte előtt beállítod a serverAllowedToRun=false -ot, akkor az leállítja a soros-port threadjét.

    class Program
    {
    // dummy data
    private static string[] fo_tomb = Enumerable.Range(0, 100).Select(x => "Machine command nr: " + x.ToString()).ToArray();
    private static bool serverAllowedToRun = true;

    public static void ComServer()
    {
    using (var port = new SerialPort("COM4"))
    {
    // ezek menjenek fgv-paraméterbe
    port.BaudRate = 9600;
    port.Parity = Parity.None;
    port.StopBits = StopBits.One;
    port.DataBits = 8;
    port.Handshake = Handshake.None;
    port.RtsEnable = true;

    port.Open();

    int n = fo_tomb.Length;
    int i = 0;

    while (serverAllowedToRun)
    {
    if (i >= n) break;

    // ez a te 'mentes_valtozo' -d
    // a PC olvasással kezd
    // ez blokkol ameddig gép nem küld valamit amit a PC tud olvasni.
    // nem pörgeti a gépet
    string machineMessage = port.ReadLine();

    // Ha a gép küldött üzenetet, akkor válaszolunk rá
    port.WriteLine(fo_tomb[i]);
    i++;
    }
    }
    }

    static void Main()
    {
    Thread serverThread = new Thread(ComServer);

    // Érdemes lehet timeoutot megadni
    // pld 10 perc: TimeSpan.FromMinutes(10);
    serverThread.Join();
    }
    }

  • joysefke

    veterán

    válasz t-shirt #8654 üzenetére

    Amikor a mentes_valtozo == null akkor a main thread üresben pörög, teljes sebességgel. És nyilván ez a "normál" állapot, mert mind a soros port, mind a munkagép sebessége elmarad a processzorétól.

    Másrészt a mentes_valtozo statikus. Ha két thread is hozzáfér, akkor a hozzáféréseket szinkronizálni kell.

Új hozzászólás Aktív témák

Hirdetés