Definitely do not start a coroutine every frame.
One solution that avoids coroutines is to just make your own float timer and count it up until it is time to re-send.
Another solution is to start the coroutine ONCE, and have a while loop that contains a yield for the appropriate wait interval.
Coroutines in a nutshell:
Splitting up larger tasks in coroutines:
Coroutines are NOT always an appropriate solution: know when to use them!
Our very own Bunny83 has also provided a Coroutine Crash Course:
https://answers.unity.com/questions/1749615/coroutines-ienumerator-not-working-as-expected.html?childToView=1749714#answer-1749714