RTV forum PL | NewsGroups PL

Ustawianie prędkości portu COM1 w Windows XP: Dziwne zachowanie z API i HyperTerminalem

Port COM w windowsie i ustawianie jego prędkoś ci z API

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Ustawianie prędkości portu COM1 w Windows XP: Dziwne zachowanie z API i HyperTerminalem

Goto page 1, 2, 3, 4  Next

Sebastian Bialy
Guest

Tue Sep 04, 2007 5:43 pm   



Witam!

Dziwny problem. Pytam tutaj bo mam nadzieje znaleźć ludzi mających
doświadczenie.

Otwieram port COM1 za pomocą mojeg programu. Program używa funkcji api
windowsa w celu otwarcia i w zasadzie ... działa.

Jednak na jednym z komputerów nie. Konkretnie to jeden komputer z
Windows XP. Po uruchomieniu API windowsa nie zgłasza błędów ale port nie
działa na ustawionej prędkości. Działa ja jakieś innej, zdaje się że
1200 bodów.

O dziwo uruchomienie Hyper Terminala, ustawienie prędkości i zamknięcie
powoduje, że mój program uruchomiony później działa poprawnie.
HyperTerminal robi "coś" w systemie co powoduje ustawienie prędkości.
Najciekawsze, że nie ważne na jaką ustawie w Hyper terminalu mój program
potrafi później ustawić taką jak powinien.

W zasadzie nie było by sprawy, bład jest u mnie w kodzie gdyby ... tak
samo jak mój program zachowuje się dowolna aplikacja pod cywinem. Może
ona ustawiać prędkość dopiero po otwarciu i zamknięciu portu przez
hyperterminal.

Zupełnie nie wiem gdzie szukać przyczyny. Kodów nie przedstawiam, bo są
typowe i jak mówie cygwin też kłopoty.

Może ktoś mający podobny problem wcześniej poratuje mnie szybką
informacją co z tym zrobić?

W systemie _teoretycznie_ nie ma nic groźnego. ActiveSync który
najwięcej przestawia wyłaczony.

Janusz U.
Guest

Tue Sep 04, 2007 7:00 pm   



wszystko zalezy czy uzywasz dawnego, standardowego API Windowsow czy tez
jakiegos komponentu .net. Jesli chodzi o to pierwsze to polecam
zainteresowac sie struktura DCB dla comm.
http://msdn2.microsoft.com/en-us/library/bb202767.aspx
http://msdn2.microsoft.com/en-us/library/ms810467.aspx

pozdrawiam
Janusz

Sebastian Bialy
Guest

Tue Sep 04, 2007 11:22 pm   



Janusz U. wrote:
Quote:
wszystko zalezy czy uzywasz dawnego, standardowego API Windowsow czy tez
jakiegos komponentu .net. Jesli chodzi o to pierwsze to polecam
zainteresowac sie struktura DCB dla comm.
http://msdn2.microsoft.com/en-us/library/bb202767.aspx
http://msdn2.microsoft.com/en-us/library/ms810467.aspx

Wszystko to oczywiście robie. Niestety coś "magicznego" w systemie nie
pozwala mi zmienić prędkości COM dopóki nie uruchomie HyperTermial. On
zwalnia jakąs blokadę i od tej pory mój program może uzywając DCB
ustawić co chce. Ponadto podobne kłopoty ma cygwin - też system olewa
ustawienia programów w cygwinie do czasu otwarcia i zamknięcia portu
przez HyperTerminal. Wtedy wszystko zaczyna działać.

Jestem przekonany że problem dotyczny konkretnego windowsa albo
aplikacji w nim z powodu działania wszystkiego na innych komputerach z
WinXP. Tylko jeden sprawia kłopoty.

Sprawdziłem też z USB->RS232 - ten sam efekt.

Oczywiście mam prawa administratora. I żadnych podejrzanych programów
uruchomionych w systemie.

Bogdan G
Guest

Wed Sep 05, 2007 5:25 am   



Quote:
Jestem przekonany Ĺźe problem dotyczny konkretnego windowsa albo aplikacji
w nim z powodu działania wszystkiego na innych komputerach z WinXP. Tylko
jeden sprawia kłopoty.

Sprawdziłem też z USB->RS232 - ten sam efekt.

Oczywiście mam prawa administratora. I żadnych podejrzanych programów
uruchomionych w systemie.

Dokładnie sprawdź wszystkie pola struktury, która steruje portem. Może
jakieś ustawienie sterowania przepływem albo jeszcze coś innego.Kabelka
używaj ze zwartymi 4-6 i 7-8 (o ile dobrze pamietam).

LukaszS
Guest

Wed Sep 05, 2007 8:18 am   



Po ustawieniu DCB musisz go zapisać f-cją SetCommState(...). Nigdy nie miałem z
tym problemu, a program pracuje na kilku tysiącach stanowisk. Poniżej masz
przykład.

--
Lukasz
N 50 05' 04"
E 19 53' 43"


void TCOMPort::UstawDCB(void)
{
DCB dcb;
if (!GetCommState(HPort, &dcb))
EMPortError::Generate(PORTERR_DCBModification, PortName,
"GetCommState");
switch (BaudRate)
{
case br___110: dcb.BaudRate = CBR_110; break;
case br___300: dcb.BaudRate = CBR_300; break;
case br___600: dcb.BaudRate = CBR_600; break;
case br__1200: dcb.BaudRate = CBR_1200; break;
case br__2400: dcb.BaudRate = CBR_2400; break;
case br__4800: dcb.BaudRate = CBR_4800; break;
case br__9600: dcb.BaudRate = CBR_9600; break;
case br_14400: dcb.BaudRate = CBR_14400; break;
case br_19200: dcb.BaudRate = CBR_19200; break;
case br_38400: dcb.BaudRate = CBR_38400; break;
case br_56000: dcb.BaudRate = CBR_56000; break;
case br_57600: dcb.BaudRate = CBR_57600; break;
case br115200: dcb.BaudRate = CBR_115200; break;
case br128000: dcb.BaudRate = CBR_128000; break;
default: dcb.BaudRate = CBR_256000; break;
}
switch (Parity)
{
case parNone: dcb.Parity = NOPARITY; break;
case parOdd: dcb.Parity = ODDPARITY; break;
case parEven: dcb.Parity = EVENPARITY; break;
case parMark: dcb.Parity = MARKPARITY; break;
default: dcb.Parity = SPACEPARITY; break;
}
switch (StopBits)
{
case sb1_0: dcb.StopBits = ONESTOPBIT; break;
case sb1_5: dcb.StopBits = ONE5STOPBITS; break;
default: dcb.StopBits = TWOSTOPBITS; break;
}
switch (ByteSize)
{
case bs5: dcb.ByteSize = 5; break;
case bs6: dcb.ByteSize = 6; break;
case bs7: dcb.ByteSize = 7; break;
default: dcb.ByteSize = 8; break;
}
// wymuszam brak handshakingu przy wysylaniu znakow:
dcb.fOutxCtsFlow = 0UL;
dcb.fOutxDsrFlow = 0UL;
// wywoluje handler uzytkownika
if (FOnCOMPortDCBChange) FOnCOMPortDCBChange(this, dcb);
if (!SetCommState(FHPort, &dcb))
EMPortError::Generate(PORTERR_DCBModification, PortName,
"SetCommState");
}

Janusz U.
Guest

Wed Sep 05, 2007 8:27 am   



uzywajac niektorych magicznych USB-RS232 ich sterowniki zmusily mnie do
wywolywania w swoim programie oryginalnego dialogu konfiguracji portu z
Windows. Po tym zabiegu nie bylo sprzetu, z ktorym program nie chcial
dzialac poprawnie. Nigdy wowczas sam nie wypelnialem struktury DCB, gdyz
robil to wspomniany dialog.

Janusz

Jerry1111
Guest

Wed Sep 05, 2007 8:54 pm   



Sebastian Bialy wrote:
Quote:
Oczywiście mam prawa administratora. I żadnych podejrzanych programów
uruchomionych w systemie.

Mialem cos podobnego na w2k. Pomoglo odinstalowanie i zainstalowanie
driverow do COMa.

--
Jerry1111

AS
Guest

Thu Sep 06, 2007 9:12 am   



[quote:ad4ee9225e]Otwieram port COM1 za pomocą mojeg programu. Program używa funkcji api
windowsa w celu otwarcia i w zasadzie ... działa.

Jednak na jednym z komputerów nie. Konkretnie to jeden komputer z Windows
XP. Po uruchomieniu API windowsa nie zgłasza błędów ale port nie działa na
ustawionej prędkości. Działa ja jakieś innej, zdaje się że 1200 bodów.

O dziwo uruchomienie Hyper Terminala, ustawienie prędkości i zamknięcie
powoduje, że mój program uruchomiony później działa poprawnie.
HyperTerminal robi "coś" w systemie co powoduje ustawienie prędkości.
Najciekawsze, że nie ważne na jaką ustawie w Hyper terminalu mój program
potrafi później ustawić taką jak powinien.
[/quote:ad4ee9225e]
Spróbuj użyć programu do podgladu transmisji przez port szeregowy PortMon
http://www.microsoft.com/technet/sysinternals/Utilities/Portmon.mspx
Porównaj to co robi twój program z tym co robi Hyperterminal.
AS

Sebastian Bialy
Guest

Thu Sep 06, 2007 6:37 pm   



Bogdan G wrote:
Quote:
Dokadnie sprawd wszystkie pola struktury, która steruje portem.

Program działa poprawnie na wielu WinXP i nie tylko. Niestety na jednym
na którym zalezy mi najbardziej nie chce. Oczywiście reinstalowałem system.

Quote:
jakie ustawienie sterowania przepywem albo jeszcze co innego

_WSZYSTKO_ co znalazłem w MSDNie jest wypełnione i poprawnie wywoływane
nie zwracając błedów. Port mnie po prostu olewa.

Quote:
uywaj ze zwartymi 4-6 i 7-8 (o ile dobrze pamietam).

Nie ma znaczenia.

Sebastian Bialy
Guest

Thu Sep 06, 2007 6:38 pm   



LukaszS wrote:
Quote:
Poniżej masz przykład.

Robie prawie dokładnie tak samo. Nie działa na jednym komputerze z WinXP
a działa na wielu innych. To zapewne problem z hardware, ale hyper
terminal potrafi _coś_ zrobic, że na nim działa ok po użyciu HT.

Sebastian Bialy
Guest

Thu Sep 06, 2007 6:40 pm   



Janusz U. wrote:
Quote:
uzywajac niektorych magicznych USB-RS232 ich sterowniki zmusily mnie do
wywolywania w swoim programie oryginalnego dialogu konfiguracji portu z
Windows. Po tym zabiegu nie bylo sprzetu, z ktorym program nie chcial
dzialac poprawnie. Nigdy wowczas sam nie wypelnialem struktury DCB, gdyz
robil to wspomniany dialog.

Nie mogę. Program jest bezobsługowy (startuje wtle jako demon) i w
dodatku ... zmienia prędkości w locie praę rzazy na minutę (mam dwa
urządzenia modbusowe nie mające wspólnego mianownika prędkości ... a
dzielące jeden kabelek rs485).

Sebastian Bialy
Guest

Thu Sep 06, 2007 6:40 pm   



Jerry1111 wrote:
Quote:
Mialem cos podobnego na w2k. Pomoglo odinstalowanie i zainstalowanie
driverow do COMa.

Akuratnie robiłem już wszystko włacznie z reistalacją windowsa. Nie
pomaga. Swoją drogą działa na tym hardware z Win98. Z XP nie.

Sebastian Bialy
Guest

Thu Sep 06, 2007 6:41 pm   



Sebastian Bialy wrote:
Quote:
[ciach]

Dziekuje za informacje. Obawiam sie jednak, że jeśli nie znajdę szybko
odpowiedzi to ... zmienie system na linuxa. To jeden z paru powodów
który mnie do tego skłania i sam sie zastanawiam po co się jeszcze męczę
z tymi comami w windowsie skoro cały soft mam przenośny.

Skoro więc nie ma prostej odpowiedzi, to temat uważam raczej za zamknięty.

Wlodziu1986
Guest

Thu Sep 06, 2007 7:20 pm   



Sebastian Bialy pisze:
Quote:
Sebastian Bialy wrote:
[ciach]

Dziekuje za informacje. Obawiam sie jednak, że jeśli nie znajdę szybko
odpowiedzi to ... zmienie system na linuxa. To jeden z paru powodów
który mnie do tego skłania i sam sie zastanawiam po co się jeszcze męczę
z tymi comami w windowsie skoro cały soft mam przenośny.

Skoro więc nie ma prostej odpowiedzi, to temat uważam raczej za zamknięty.


Witaj

Wyślij mi ten programik na którym ci zależy aby uruchomić przetestuje go
i dam ci odpowiedz.

Jaroslaw Berezowski
Guest

Thu Sep 06, 2007 8:02 pm   



Sebastian Bialy napisał(a):
Quote:
LukaszS wrote:
Poniżej masz przykład.

Robie prawie dokładnie tak samo. Nie działa na jednym komputerze z WinXP
a działa na wielu innych. To zapewne problem z hardware, ale hyper
terminal potrafi _coś_ zrobic, że na nim działa ok po użyciu HT.
To zapodaj monitorek z SysInternals i zobacz co ten HT tam robi.


--
Jaroslaw "Jaros" Berezowski

Goto page 1, 2, 3, 4  Next

elektroda NewsGroups Forum Index - Elektronika Polska - Ustawianie prędkości portu COM1 w Windows XP: Dziwne zachowanie z API i HyperTerminalem

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map