Might as well go for a DFA directly.
First, recognize the string 01111110
. If you see something you don't expect, then the information is malformed and you should enter a dead state.
Once you've seen 01111110
, start looking for 01111110
again, but this time, if you see something you don't expect, begin looking for 01111110
again from scratch. Once you see a complete 01111110
, you have consumed an entire frame, and you should be in an accepting state.
Then, from this halting state, we add the same transitions we have on our initial state; i.e., we leave open the possibility that there are additional frames. Here's a transition table corresponding roughly to what I've indicated:
State Input New State
q0 0 q1
q0 1 dead
q1 0 dead
q1 1 q2
q2 0 dead
q2 1 q3
q3 0 dead
q3 1 q4
q4 0 dead
q4 1 q5
q5 0 dead
q5 1 q6
q6 0 dead
q6 1 q7
q7 0 q8
q7 1 dead
// we've seen the leading 01111110
q8 0 q9
q8 1 q8
q9 0 q9
q9 1 q10
q10 0 q9
q10 1 q11
q11 0 q9
q11 1 q12
q12 0 q9
q12 1 q13
q13 0 q9
q13 1 q14
q14 0 q9
q14 1 q15
q15 0 q16
q15 1 q8
// we have now seen the trailing 01111110, a whole frame
// q16 is the only accepting state.
q16 0 q2
q16 1 dead
Naturally, you'll want to check that very carefully. If the goal is outputting the message in between the leading and trailing patterns, you might need some extra states to remember input symbols that may or may not be part of the trailing pattern; but for accepting input which consists of a finite number of valid frames, this (or something close to it, if I've made a silly blunder) should be enough.