Click here to Skip to main content
15,892,697 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi All,
I am having a bit of trouble with some serial port reading. I am reading the data using ReadExisting() but once it is read it appears to remain on the Port until cleared using the following in a seperate button click

C#
ComPort.DiscardInBuffer();
 ComPort.DiscardOutBuffer();

  rtbIncomingData.Text = "";

If I manually click the button it clears the relavent buffers and rich textboxes and works. My thinking was "thats a bit odd, but got a get around" and I called the click routine from the read port function this did not work. so I copied the code out of the function and tried again, still not working. My thinking was this was too quick for the data to be there. If I use a standard Windows timer from the tool box, with a 1 Sec period this appears to 'cure' the issue but I have been bitten by these timers before and have sent code to clients that "Works on my Machine" but not the customers at the moment I am trying to avoid this. Any one any ideas, suggestions, please??
Posted
Comments
lukeer 12-Dec-12 7:31am    
Where did you get the information that the data is still there, even after you have read it?
glennPattonWork3 12-Dec-12 8:07am    
I know its wrong, I know the data isn't there but if I try to read it I get the previous reply. I think it is because it's still in the buffer ComPort buffers if I manually clear them it's fine I think. Glenn
lukeer 13-Dec-12 3:16am    
So it's two consecutive reads that return the same data?
Perhaps the data is indeed received twice. Try a null-modem cable to another COM port so you have full control over what is being sent. Then check the receiving port again.

Hi,

Indeed, that is bit odd. Buffers should be cleaned automatically when reading is done.

Anyway, try Thread.Sleep(100) after reading. I think 100ms should be enough.

Regards.
 
Share this answer
 
Hi,
Thanks for that I think I have now worked out why. It's a Half Duplex System, I need to get my software to send and recieve from it. I wasn't expecting that. Any ideas....
Glenn
 
Share this answer
 
If you read the documentation on the ReadExisting function, you'll see there is a warning that bytes could get left in the internal buffer because of the way that function works. MSDN Library Link Here[^]

If the data coming in is terminated with a CR or CR/LF, you can use ReadLine instead... which will block until it sees the CR character on the input stream. Most devices will terminate their communications with a CR automatically. If you can tolerate a possible delay or handle a situation where you may not get a CR (by specifying a timeout on that function and handling the exception) then this is one of the best functions to use (in my opinion anyway). It returns essentially a single "message" from the device without worrying about detecting the CR/Length/etc.

Alternately, you can query the serial port on a regular basis looking for characters to be present by checking the BytesToRead property. If that is greater than 0, use ReadByte, ReadChar, or ReadTo depending on your encoding and needs.

Honestly, I'm not sure why ReadExisting is even available. I guess for high-speed applications where you might need the contents of the buffer and the underlying stream, you might need something like this, but for general serial port work, you should probably avoid it. The other "read" functions work only on the buffer which should be sufficient for nearly everything and avoids the complexity of dealing with both the buffer and the stream.

I've done a lot of serial port work over the years. If you have any more questions, shoot me a message and I'll try to give you some help.

Jason
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900