Hi, weiß jmd wie man beim FTDI einen Break vom DMX-Signal erkennen kann? Ich möchte gern DMX empfangen mit einem FTDI. Das Signal kommt auch an, aber der DMX-Wert0 entspricht nicht dem ersten Wert im Buffer vom FTDI. Gibt es hier eine Möglichkeit ähnlich wie bei einer normalen UART dass man den Break erkennen kann? Gruß Bernd
habs mittlerweile gefunden, nur funktionieren tut es leider noch nicht, die Break Detection wird immer zweimal pro 514-Bytes aufgerufen; zu unterschiedlichen Werten.... Aber als Funktion muss FT_W32_ClearCommError verwendet werden und als Error muss danach CE_BREAK ausgewertet werden.... Vielleicht hat jmd noch einen Hint an was das liegen könnte.
Michael Roek-ramirez schrieb: > Ruecksetzen des Timers vergessen. Welcher Timer muss zurückgesetzt werden? Bis jetzt arbeite ich ohne Timer...
Hier mal mein Code um das DMX Signal auszulesen. Wie gesagt der CE_BREAK kommt zweimal innerhalb eines DMX Frames an - einmal zu Beginn (DMX Break) und einmal mitten drin in einem DMX Frame. Mit dem Oszilloskop kann ich aber keine Break (low-level) über mehr als 8Bits erkennen; sprich die Stoppbits sind immer vorhanden.
1 | while(1) |
2 | { |
3 | dwError =0; |
4 | |
5 | if(!FT_W32_ClearCommError(ftHandle, &dwErrors, (FTCOMSTAT *)&newCS)) |
6 | { |
7 | //error |
8 | return; |
9 | } |
10 | |
11 | if(dwError & CW_BREAK) |
12 | { |
13 | ftHandle = FT_GetStatus(ftHandle, &RxBytes, &TxBytes, &EventDword) |
14 | if(RxBytes > 0) |
15 | { |
16 | printf("bytes received: %d\n", RxBytes); |
17 | } |
18 | } |
19 | } |
Michael Roek-ramirez schrieb: > > Ruecksetzen des Timers vergessen. Hab jetzt vor der while(1) Schleife den FT_SetLatencyTimer(ftHandle, 50); platziert und es scheint, dass dieser Timer der Grund für das Fehlverhalten war. Jetzt treten die CE_BREAK Messages nämlich zu anderen Zeiten auf. Wie setze ich allerings diesen Timer wieder zurück? Bzw. kannst du mir ein kurzes Beispiel geben, wie ich mit diesen Timern umgehen muss? Hab auch schon versucht den Timer genau auf die Refreshrate zu setzen, aber auch hier bekomme ich falsche Break conditions geliefert. Gruß Bernd
hab jetzt nochmal einen Versuch gestartet, indem ich das Enttec Projekt mir angeschaut habe: leider wird auch in deren Beispiel der DMX Break nicht richtig erkannt...
1 | // set RS485 for receive
|
2 | FT_W32_EscapeCommFunction(ftHandle,SETRTS); |
3 | |
4 | FTTIMEOUTS ftTS; |
5 | ftTS.ReadIntervalTimeout = 0; |
6 | ftTS.ReadTotalTimeoutMultiplier = 0; |
7 | ftTS.ReadTotalTimeoutConstant = 1000; |
8 | ftTS.WriteTotalTimeoutMultiplier = 0; |
9 | ftTS.WriteTotalTimeoutConstant = 200; |
10 | FT_W32_SetCommTimeouts(ftHandle,&ftTS); |
11 | |
12 | DWORD dwMask = EV_ERR; |
13 | FT_W32_SetCommMask(ftHandle,dwMask); |
14 | DWORD dwEvents; |
15 | |
16 | while (!Terminated) |
17 | {
|
18 | FT_W32_WaitCommEvent(ftHandle, &dwEvents, NULL); FT_W32_ClearCommError(ftHandle, &dwErrors, (FTCOMSTAT *)&newCS); |
19 | |
20 | if (dwErrors != dwOldErrors) |
21 | {
|
22 | bChanged = true; |
23 | dwOldErrors = dwErrors; |
24 | }
|
25 | |
26 | if (bChanged) |
27 | {
|
28 | if ((dwErrors & CE_BREAK) || (dwErrors & CE_FRAME)) |
29 | {
|
30 | FT_W32_ReadFile(ftHandle, &temp_StartCode, 1, &bytesWritten, NULL); |
31 | FT_W32_ReadFile(ftHandle, temp_DMXData, 512, &bytesWritten, NULL); |
32 | |
33 | TRACE("dmx data received: %d, %d\n", temp_DMXData[0], temp_DMXData[1]); |
34 | |
35 | }
|
36 | }
|
37 | |
38 | FT_W32_PurgeComm(ftHandle,FT_PURGE_TX | FT_PURGE_RX); |
39 | memset(&temp_DMXData[0], 0x00, 512); |
40 | }
|
Den SetLatenyTimer hab ich per Default auf 16ms stehen gelassen. Wurde im Enttec Projekt auch nicht angetastet. Wenn jmd ne Ahnung hat oder mit einem anderen Derivate von FTDI DMX Receive schon realisiert hat, wäre ich um einen Hint etc. sehr froh. Ich selbst verwende momentan den FT4232H. Gruß Bernd
hat keiner eine Ahnung? Vielleicht übersehe ich ja irgendwas wichtiges? Gruß Bernd
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.