C# - wyslanie danych (comport) zawiesza aplikacje.

0

Witam

Jestem w trakcie pisania aplikacji i nie wiem dlaczego ale aplikacja mi się zawiesza nie wywalając żadnego błędu. Ponieważ w pierwszej aplikacji miałem ten sam problem i nie znalazłem rozwiązania, zacząłem pisać nową aplikacje i mam ten sam problem.

Trudno jest opisać problem, który nie wywala żadnego błędu a tylko zawiesza program.
Może więc ktoś powie mi jak mam sprawdzić co jest wynikiem zawieszenia mojej aplikacji.

Znalazłem linię w której zawiesza się aplikacja, lecz zupełnie nie wiem co może być powodem takiego zachowania.

Jezeli linia poniżej wysyła ciąg składający się z maksymalnie 13 znaków to aplikacja się nie zawiesza


     ComPort.WriteLine("Interface-SET");

Jeżeli chce wysłać większą ilość znaków:

      ComPort.WriteLine("Interface-Setings");

to aplikacja wisi nie wywalając żadnego błędu.

nie mam pomysłu dlaczego tak się dzieje, proszę więc pomóżcie mi znaleźć powód zawieszania się aplikacji. Głownie chodzi mi o pomoc, która pozwoli mi zlokalizować błąd.

Ogólnie mówiąc nie wiem jak zlokalizować błąd ;(
pomóżcie.

0

A co to za obiekt ComPort? Jeżeli to jakiś SerialPort, to jesteś pewien, że coś te dane odbiera? Bufor się zapełnił i metoda czeka na jego opróżnienie.

0

Oczywiście mowa o SerialPort :D - comport mi pozostało z delphi :D

Bufor Tx i Rx mam ustawiony na 4096 bajtów.

mówimy tutaj o 13 znakach :D

po drugie ja tutaj wysyłam 13 znaków i jest ok - program się nie zawiesza a jak wyśle 14 to wisi bez wywalenia jakiegokolwiek błędu - to czy po "drugiej stronie" cos odbierze dane czy tez nie chyba nie ma znaczenia :D

podejrzewam, ze może to mieć wpływ, ze procedura wysyłania danych jest wykonywana w zdarzeniu timera?

1

od dłuższego czasu piszę aplikacje, które komunikują się z różnymi urządzeniami po RS232. W szczególności z etykieciarkami, do których idzie czasem i parę kilo danych ciągiem. Linie mają od -nastu do -dziestu znaków i nigdy nie zauważyłem takiego efektu. Używam zarówno wbudowanych w sprzęt portów COM jak i przejściówek USB->COM (głównie MOXA ale zdarzają się też NONAME). Podejrzewał bym prędzej sam sprzęt jeśli to przejściówka bądź sterownik. Spróbuj wysłać to czymś innym - np http://www.serialporttool.com/CommOpInfo.htm
PS. ja używałem c# 2.0 i 3.5 i nie miałem problemu

0

Bufor się zapełnił i metoda czeka na jego opróżnienie.

napisałem inna aplikacje, która odbiera dane wysłane, ale żadne dane nie dochodzą, jak string ma 13 bajtów to dane dochodzą i wszystko działa ok, problem w tym, ze ja musze wysłać dość dużo bajtów :(

sprawdziłem jedną rzecz - otóż nie ma znaczenia czy w jednej linijce wysyłam 14 bajtów:

      ComPort.WriteLine("Interface-SETINGS");

czy zrobię cos takiego:

    ComPort.WriteLine("Interface-SET"); /// to działa
    ComPort.WriteLine("INGS");  //już wisi

ale sprawdzę jeszcze czy przypadkiem wirtualne porty com wywołują ten problem

0

abrakadaber

Wielkie dzięki ..... masakra nie wpadłem na to ze to porty wirtualne mogą mi zawieszać aplikacje - nie wiem dlaczego zawsze szukam błędu po swojej stronie :)

Ogólnie jest tak, ze w laptopie nie mam COM'ow podpinam conwerter USB<=>RS232 i wtedy działa prawidłowo.
Natomiast na etapie którym jestem to zainstalowałem sobie wirtualne poty połączone ze sobą (com0com) takie rozwiązanie jest dość fajne, bo napisałem sobie aplikacje, która odczytuje dane wysłane przez pierwsza aplikacje i druga aplikacja kontynuuje komunikacje.
W ten sposób jestem empirycznie sprawdzić poprawność wysyłanych danych. Program com0com fajnie paruje ze sobą COMy czyli COM3 Tx <=> COM4Rx i wszystkie pozostałe sygnały tez są odpowiednio połączone.

Może znasz jakiś podobny program, który działa prawidłowo?

0

znaczy ja używam com0com i nie miałem z nim takich problemów :/

0

znaczy ja używam com0com i nie miałem z nim takich problemów :/

a może mi powiedzieć, może włączasz jakieś dodatkowe opcje w setup'ie ? bo ja tylko "use ports class"

0

szczerze powiedziawszy to nie pamiętam abym coś zmieniał - nawet nazwy portów zostawiłem tak jak było

0

Trochę poeksperymentowałem i widzę, ze com0com działa poprawnie gdy ustawimy poniższe parametry:

  • use Ports class
  • emulate baud rate
  • enable buffer overrun

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