Keep the data in byte form (~50% less data movement than ASCII, no interpretation required on board 1). Create a data packet scheme to send data and requests to board 1. To keep things simple, maybe just send 1 variable at a time rather than all 50+. I would also suggest a fixed packet size going from board 2 to board 1.
Maybe:
Byte 1: Message start; is this a variable or a request for data?
Byte 2: Variable number or request number.
Byte 3: MSB of variable or dummy data if a request
Byte 4: LSB of variable or dummy data if a request
Byte 5: Checksum of message
Byte 6: End of transmission byte
Board 1 should send some kind of acknowledge message after the 6 bytes are received and interpreted (Message OK or error) as a handshake.
If the data coming back from board 1 to board 2 doesn't fit this scheme, you can create a different scheme for the return data. You're writing both end so it's up to you.