Hola!
Creo que el problema esta acá el bucle while esta de más.
foreach(COM, puertos){
port->setPortName(COM); //Seteo el nombre del puerto ej: COM7
if(port->open(QextSerialPort::ReadWrite)){// si conecta:
conexion = true;
emit Connection_Ready(conexion, COM);
}
Al poner este bucle estamos recorriendo todos los elementos de COM, por lo tanto se va a conectar a todos los que pueda.
Lo que tendrías que hacer es cuando ya este conectado a uno salir del foreach.
Por otro lado el foreach solo pasa una vez por cada elemento por lo que no va a seguir probando siempre. Con el while lo que hacías es después de probar una vez con cada uno lo volvía a hacer si no tenia conexión.
Si hay algo que haga q el while tenga que estar si o si entonces cambialo por una for que repita el procedimiento x veces ejemplo:
for(int i=0; !conexion && i<veces;i++ )
{
//codigo
}
edit:
Es más si cambias el foreach por un for podes hacer que termine cuando haya conectado...