NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Michaal.K
Člen
Avatar
Michaal.K:1.4.2016 14:47

Ahoj,
řeším timeout v sériové komunikaci. Mám tam test připojení se zařízením, kde nastavím timer (událost a čas), otevřu port, vyšlu data a zapnu timer. Při přetečení timeru odeberu událost, zastavím ho a zavolám metodu. Když přijmu nějaká data odeberu událost timeru, zastavím ho a vypíšu data.
Komunikuji s několika zařízeními a jedno mi odpoví až když zkusím test připojení (metoda ConnectionTest) na podruhé. Na poprvé mi timer přeteče... Tak se chci ujistit, že timer obsluhuji dobře. Díky moc za rady

public delegate void TimedEventEventHandler();
public event TimedEventEventHandler OnTimedEvent;
private System.Timers.Timer timerTimeout;
public void ConnectionTest(SerialPort comPort)
{
        SetTimerTimeout();
        if (!comPort.IsOpen)
                ConnectedOne(comPort);
        int adrPortuList = serialPorts.IndexOf(comPort);
        WriteData(adrPortuList, "Test");
        timerTimeout.Enabled = true;
}
private void SetTimerTimeout()
{
        timerTimeout = new System.Timers.Timer(1000);
        timerTimeout.Elapsed += new System.Timers.ElapsedEventHandler(timerTimeout_Elapsed);
}
private void closeTimerTimeout()
        {
            timerTimeout.Elapsed -= new System.Timers.ElapsedEventHandler(timerTimeout_Elapsed);
            timerTimeout.Enabled = false;
        }
void timerTimeout_Elapsed(object sender, EventArgs e)
{
        closeTimerTimeout();
        OnTimedEvent();
}
void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
        try
        {
                if (timerTimeout.Enabled)
                {
                    closeTimerTimeout();
                }
                SerialPort comPort = (SerialPort)sender;
                string data = comPort.ReadExisting();
                if (OnSerialDataReceived != null)
                {
                    OnSerialDataReceived(comPort, data);
                }
            }
        catch (Exception ex)
        {
                MessageBox.Show(ex.Message, MainForm.appName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
}
 
Odpovědět
1.4.2016 14:47
Avatar
LacoS.
Člen
Avatar
LacoS.:8.4.2016 13:08

Nevyzera to zle, ale skusil by som toto:
... najprv by som otvoril COM port, a az po uspesnom otvoreni portu by som vysielal...

 
Nahoru Odpovědět
8.4.2016 13:08
Avatar
Michaal.K
Člen
Avatar
Michaal.K:8.4.2016 13:54

Ahoj,
ale tak to dělám, že nejdříve otevřu sériový port a pak až vyšlu data. V metodě ConnectionTest mám podmínku if (!comPort.IsOpen) a když není otevřen port volám ConnectedOne(com­Port), kde ho otevřu viz kód níže:

public void ConnectedOne(SerialPort comPort)
        {
            try
            {
                if (!comPort.IsOpen)
                    comPort.Open();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Port nelze otevřít ");
            }
        }
 
Nahoru Odpovědět
8.4.2016 13:54
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.