Data is transmitted as serial UART data, 115200bps, 8N1. A message is sent every 7 milliseconds. My receiver sends this over its white wire, and stops sending a few tenths of a second after the transmitter is switched off (unlike the PPM signal on the yellow wire, which keeps sending its last value).
The first byte is 0x20, the second is 0x40.
Next are 14 pairs of bytes, which is the channel value in little endian byte order. The FS-i6 is a 6 channel receiver, so it fills in the first 6 values. The remainder are set to 0x05DC. My transmitter sends values between 0x3E8 and 0x7D0.
Finally a 2 byte checksum is sent. It’s in little endian byte order, it starts at 0xFFFF, from which every byte’s value is subtracted except for the checksum.
I’ve written a library to decode this data. An Arduino could measure the time of the message start to improve detection of the message start. One problem using an Arduino is that the board will interfere with programming - a resistor (maybe 10k) on the data line should help.