TANC-security / keypad-firmware

ECP keypad implementation for Arduino/AVR
https://alarmtool.com/
GNU Lesser General Public License v2.1
40 stars 8 forks source link

Overlapping messages #6

Open ghost opened 6 years ago

ghost commented 6 years ago

On occasion the Serial.read() on my network arduino would get overlapping messages from the Alarm Panel arduino on the Serial.println() when the display message and the status message were really close together on an event change like arming system. The Serial.read() would start getting the Display message and then the Status message would cut in and would get a mixed string of display and status. A quick fix to that was to add Serial.flush(); to the end of each Display and Status message. So far that seems to be working great with no issues. Just thought I would pass that along.

ghost commented 6 years ago

Stand corrected, the serial.flush() reduced the problem but still getting a random few overlapping messages on the network arduino. Serial console on the first alarm panel aruino is showing just fine so the problem is with the timing on the serial connection to the second arduino when the incoming alarm panel message come in too close together. Seems to only happen on the display message but the overlapping message that cuts in could be a status message or a display message which I think is due to the display message being significantly longer. Still researching this problem.

markkimsal commented 6 years ago

Is the message that cuts in complete and then the original message finishes or do they intertwine?

{F7...}{F2}{...F7}

or

{F7...}{F2...}{...F7}{...F2}{...F7}
ghost commented 6 years ago

I changed the Json into a much smaller packet so it fits in the 64bit serial limit and to keep it small as possible. Your core structure is the same, just different message format in your Json section. Here is what proper messages look like. Display message: LEN: 42 MSG: DFFFFTFTF: DISARMED CHIME Hit * for faults Status message: LEN: 6 MSG: SFTTTF

Here are some sample collisions. LEN: 61 MSG: DTFFFTFTT:ARMED DTFFFTFTT:ARMED AWAYMay Exit Now 44 LEN: 25 MSG: DTFFFTFTT:ARMED SFTTTF LEN: 61 MSG: DTFFFTFTT:ARMED DFFFFTFTF: DISARMED CHIME Hit for faults LEN: 61 MSG: DTFFFTFTT:ARMED **DTFFFTFTT:ARMED AWAYMay Exit Now 42 LEN: 61 MSG: DTFFFTFTT:ARMED DTFFFTFTT:ARMED AWAYMay Exit Now 29 LEN: 25 MSG: DTFFFTFTT:ARMED ***SFTTTF

In all cases, the second message cuts into the first message and the first message never completes and the second message takes over and prints in full. Also interesting to note that it seems to cut in at the same 20th char and we get the first 19 chars of the first message. On the alarm panel arduino, the serial console never ever shows these collisions and the Serial.print is clean and never see any problems. It only happens on the second arduino that is doing the serial1.read() where the collisions happen.