??? 04/24/09 18:21 Modified: 04/24/09 18:25 Read: times |
#164824 - BREAK detection is lousy! Responding to: ???'s previous message |
Chico said:
I learned from Kathy's DMX receiver code a technick to receive the DMX data, I think it is a bit dirty way to do, but I already tested and works.
He/she sets the serial port to 9bit mode, when receive a byte, look if the 9th bit is clear and byte is zero, if yes, should be a break! It's not dirty, but dangerous! What if the byte is a normal data byte and the 9th bit is incidentally low, because of a glitch? A total transmission disaster because of one single glitch? No, the BREAK is too important and deserves a more reliable detection. I wouldn't switch the UART modes either. I would take Mode 1 (1+8+1) for all and check the second stop bit of DMX transmission on the RXD line manually. The first stop bit can be checked by polling the RB8 register. If it's high, then a data byte was received. If it's low and the SBUF contains a zero byte, then a BREAK could have been received. Check also the second stop bit, then (manually). If it's also low, then a BREAK could have been received. Then, check the RXD line by periodically polling for at least further 40µsec and accept a BREAK only if all the pollings were low. If a glitch destroys a data byte, then only one member gets wrong data, but if a BREAK is erroneously detected, all members might get wrong data! Chico said:
Will RI be set after receiving a break? Of course, if you set SM2=0 in UART Mode 1. Chico said:
Can I look RxD state just after RI is set? Of course, but remember that RI is set about in the middle of stop bit time. Also remember that the stop bit is saved in RB8 register. Kai |