Diskuze: c# form - timeout v sériové komunikaci

C# .NET .NET (C# a Visual Basic) c# form - timeout v sériové komunikaci American English version English version

Avatar
Michaal.K
Člen
Avatar
Michaal.K:

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. dubna 14:47
Avatar
LacoS.
Člen
Avatar
LacoS.:

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. dubna 13:08
Avatar
Michaal.K
Člen
Avatar
Michaal.K:

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. dubna 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.