Receive Serial Data in Background
readline is a blocking operation : http://pyserial.readthedocs.io/en/latest/shortintro.html#readline

Try to use something like :

def modal(self, context, event):
    if event.type  == 'LEFTMOUSE':
        ser.close()
        return {'FINISHED'}
    if ser.inWaiting()!=0: # or if ser.in_waiting !=0: (see remarks below)
        self.x = int(ser.readline())
        if self.x &gt;0:
            value = int(self.x)
            value += 10
            degree = value * 3.14/180
            bpy.context.object.rotation_euler[0] = degree
            print(degree)
    return {'RUNNING_MODAL'}


Another edit as I have read that "inWaiting" function may have been changed into a property form from v3.0 of Python : 


  in_waiting
      Getter:   Get the number of bytes in the input buffer
      Type: int

Return the number of bytes in the receive buffer.

Changed in version 3.0: changed to property from inWaiting()



So you should replace "if ser.inWaiting()!=0:" by "if ser.in_waiting !=0:".

Edit for a little explanation : the line "if ser.inWaiting()!=0:" wont block as it is just testing if there is something to read. So if nothing is available, the function will directly go through the "return {'RUNNING_MODAL'}" without blocking.

You can also test the behavior, replacing "if ser.inWaiting()!=0:" by "while ser.inWaiting()!=0:". It's hard to know which is better. The difference is "if" will immediately give the hand to Blender and "while" will eventually take into account several serial inputs before giving back the hand to Blender.

For this line :             self.x = int(ser.readline())
You should also read data depending on the waiting available bytes you need here (but as I dont know how your device communicates... I cant say).

(not tested)