puart_read/puart_write will never underflow/overflow the FIFO (they always check to see if the FIFO has bytes/not full before reading/writing).
puart_synchronousRead/puart_synchronousWrite may underflow/overflow the FIFO. So you should know how many bytes you can read/write from/to FIFO before you call these.
puart_print is a string printing function that looks for a null terminator to indicate when to stop printing. It uses puart_write to do the actual write.