Blender game hangs when serial read()
From the pySerial API for read():


  With no timeout it will block until the requested number of bytes is
  read.


Blender only has one thread, so blocking this thread will cause the game engine to hang as it waits for the read() command to finish.

Right now I can think of two possible solutions:


Set a timeout using timeout = x. Again from the API:


  Possible values for the parameter timeout which controls the behavior
  of read():
  
  
  timeout = None: wait forever / until requested number of bytes are
  received
  timeout = 0: non-blocking mode, return immediately in any
  case, returning zero or more, up to the requested number of bytes
  timeout = x: set timeout to x seconds (float allowed) returns
  immediately when the requested number of bytes are available,
  otherwise wait until the timeout expires and return all bytes that
  were received until then.
  

Create another thread and execute MoveCube() in it. This will cause ser.read() not to be executed in the Game Engines main thread and thus it will not be blocked, but the newly created thread will be blocked. 


As the first suggestion is simpler to implement and uses less resources, I'd prefer it. 

On another note: the bpy module is Blender's API and not the Game Engine's API. So if you want to export your game and use it outside of Blender as a standalone, I'd recommend not using bpy at all, as it will not work. See this post for more information.