The exception is very specific, it only ever means one thing. The port is already opened, you cannot open it again. It might be another process, it could be your own.
A standard mistake you could make that makes it specific to a debug session is to use another program to look at the data sent by the port. A common thing to do, you'd want to compare the data displayed by such a program with the data you display to look for a mismatch. This cannot work, you start such a program before you start your own, it will open the port and your program will always fail. You need a different kind of utility to do this, a filter driver that injects itself ahead of the serial port driver and spies on the driver requests. SysInternals' PortMon is an example.
Any only when there is data being streamed from the tag reader
This comment is very troublesome, you must of course always open the port well before the tag reader starts streaming data. This hints at a very different kind of bug, ought to be visible from the full stack trace. Some scenario where the code in the DataReceived event handler causes the Open() method to be called again. Possibly well hidden due to a Begin/Invoke() call inside your DataReceived event handler.
Last but not least, do make sure that you never repeatedly call Close() and Open(). The Close() call doesn't actually close the serial port, it only starts to close it. An internal worker thread needs to exit, that takes time. Only ever call Close() at program termination.