I discovered the problem. I was reading the results from ReadString() into a string buffer. The values being returned by the device were binary, and there was a binary 0 within the string, which caused everyting to blow up. The problem is that the .NET framework handles strings differently than it did in VB6, where a binary 0 within a string wasn't a problem. I changed to reading the results of ReadString() into a byte array and everything works fine now. I guess .NET reads a binary 0 literally (nul), which wreaks havoc.
Lesson learned. Another step up the .NET learning curve.