FTDI: DMX Rx Break detection

Gast #1903095
Lesenswert?

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
Gast #1903406
Lesenswert?

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.
Gast #1904218
Lesenswert?

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
}
Gast #1904339
Lesenswert?

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
Gast #1905722
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren