Diskuze: Komunikace se seriovym portem - duplicitni znaky

C# .NET .NET (C# a Visual Basic) Komunikace se seriovym portem - duplicitni znaky American English version English version

Avatar
roman_8253
Člen
Avatar
roman_8253:

Zdravim, vytvarim program pro praci se zarizenim pomoci serioveho rozhrani. Vsechno funguje, akorat kdyz zadavam parametry do zarizeni z commandline tak se mi vypisuji pismena 2x:
Napr. sseett tteemmpp a melo by byt set temp.
Problem je, ze jakmile se odesle znak na serial port pak se ihned precte na vystupu z nej a vytiskne na stdout. Otazka tedy zni jak potlacit, aby se mi vlozene znaky nevraceli zpet pres event datarecieve. Prochazel jsem vlastnosti SerialPortu a neprisel jsem na to co zapnout / vypnout, aby se to nedelo.

var serPort = new SerialPort () {
        NewLine = "\n"
};
        serPort.DataReceived += delegate (object sender, SerialDataReceivedEventArgs e) {
                        SerialPort serialPort = (SerialPort)sender;
                        Console.Write (serialPort.ReadExisting ());
                };

//pro zapis na port
while (true) {
        keyPress = Console.ReadKey();
        if (keyPress.Key == ConsoleKey.Enter) {
                serPort.Write(new byte[] { 13 }, 0, 1);
        }
        else {
                serPort.Write(keyPress.KeyChar.ToString());
        }
}
 
Odpovědět 18. září 21:24
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na roman_8253
Martin Dráb:

Není to spíš způsobeno tím, že dané zařízení prostě přijatý znak pošle (pro kontrolu) zpátky? Pokud ano, vidím dvě mžonosti:

  1. pokud je to tebou stvořené zařízení, přeprogramovat jej,
  2. pokud ne, tak prostě při odeslání znaku vždy čekej, až ti to zařízení potvrdí příjem. Už si to moc nepamatuju, ale myslím, že sériová linka je poloduplexní; nedovoluje zároveň posílat data v obou směrech, jen v jednom.
Nahoru Odpovědět 19. září 0:35
2 + 2 = 5 for extremely large values of 2
Avatar
roman_8253
Člen
Avatar
Odpovídá na Martin Dráb
roman_8253:

Tak to nevim, kazdopadne pres screen nebo putty se chova uplne standartne.
Ad 1/ Neni
Ad 2/ Ano je Half Duplexni

Aktualne to resim boolean prepinacem, protoze me napadlo to same - jedna se o potvrzeni prijmu. Ocekaval jsem, ze se jedna o standartni implementaci komunikace a tak to pujde standartni vlastnosti potlacit. Tak nic necham jak mam a nebudu dale resit.

 
Nahoru Odpovědět 19. září 10:53
Avatar
jan.pichl
Člen
Avatar
jan.pichl:

Nečteš náhodou stejný signál, kteý odesíláš ? Standartní zapojení signálů portu je stanice 1 -- stanice 2 tedy Full duplex.

Rx ---- Tx
Tx ---- Rx
Gnd --- Gnd

Samozřejmě můžeš použí i Half duplex
Rx/Tx -- Rx/Tx
Gnd -- Gnd

To potom ovšem znamená si vytvořit vlastní řízení komunikace.

Standartně je to tak že jedním pinem konektoru odesíláš a jiným čteš. Pokud chceš jeden pin na čtení a odesílání zároveň a nemůžeš přeprogramovat cílovou stanici. Tak možná jedinná možnost je filtrovat z přijaté zprávy odeslané znaky. Ovšem kde vzít záruku že přijdou v pořadí v jakém byli odeslány ? Jedině je řešit po jednom. Poslat počkat na odpověď poslat další.

 
Nahoru Odpovědět 20. září 8:59
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 4 zpráv z 4.