I am putting below my opinion based on my experience with I2C Bus of UNO:
1. All information starting from Wire.beginTransmission(); and before Wire.endTransmission(); are queued in a buffer.
2. With the execution of the Wire.endTransmission(); all the queued information are transferred to the slave on hand-shaking basis.
3. Now, to become sure that the information has transferred correctly, there is a way of checking status which the Wire.endTransmission(); function generates. A value of 0x0000 for the status indicates successful transmission.
4. There are many ways of checking this status; however, I check this way: (you may try it). Note: This is for a healthy bus. If there is something wrong with the transmission, the bus will be locked, and you have to reset the system to come out. These codes have not included the time-out option. Alternative codes could be written giving 100 ms(say) time-out option using millis() function.
void setup()
{
do
{
Wire.beginTransmission(0x74); //be sure that the slave address is correct!
int test1 = Wire.write(1);
int test2 = Wire.write(50);
}
while ((Wire.endTransmission()) != 0x00);
Serial.print(test1);
Serial.print(test2);
Serial.print(" ");
Serial.print(test3);
Serial.print('\n');
}
void loop()
{
}