Reputation: 315
I am trying to create a RS232 application that reads incoming data and stores it in a buffer. I found the following code in an RS232 example but I am not sure how to use it
*RS232 Example port_DataReceived*
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (!comport.IsOpen) return;
if (CurrentDataMode == DataMode.Text)
{
string data = comport.ReadExisting();
LogIncoming(LogMsgType.Incoming, data + "\n");
}
else
{
int bytes = comport.BytesToRead;
byte[] buffer = new byte[bytes];
comport.Read(buffer, 0, bytes);
LogIncoming(LogMsgType.Incoming, ByteArrayToHexString(buffer) + "\n");
}
}
I am trying to write another method that takes an incoming byte array and combines it with another array ... see below:
private void ReadStoreArray()
{
//Read response and store in buffer
int bytes = comport.BytesToRead;
byte[] respBuffer = new byte[bytes];
comport.Read(respBuffer, 0, bytes);
//I want to take what is in the buffer and combine it with another array
byte AddOn = {0x01, 0x02}
byte Combo = {AddOn[1], AddOn[2], respBuffer[0], ...};
}
I currently have both methods in my code as I am confused how to read and store the incoming bytes to the port. Can I use the "port_DataReceived" method in my "ReadStoreArray" method? Do I need to modify my "ReadStoreArray" method? Or should I just start over?
Upvotes: 5
Views: 45651
Reputation: 11
If you have a delimiter you can check for the delimiter and read the next amount of the data buffer required.
byte[] RawData;
try
{
SerialPort serialPort = new SerialPort("COM11", 230400);
serialPort.ReadTimeout = 1000;
serialPort.WriteTimeout = 1000;
if (serialPort.IsOpen) serialPort.Close();
serialPort.Open();
using (var binaryReader = new BinaryReader(serialPort.BaseStream))
{
//while (!FindForDelimiter(binaryReader))
//{
// Thread.Sleep(1);
// //FindForDelimiter(binaryReader);
//}
while (serialPort.IsOpen)
{
try
{
RawData = binaryReader.ReadBytes(5);
for (int offset = 0; offset < RawData.Length; offset += 5)
{
ulong lasttime = BitConverter.ToUInt32(RawData, 0);
Console.WriteLine(lasttime);
}
}
catch
{
}
}
}
In mine, i have requirement to find the delimiter its works my use case
Upvotes: 1
Reputation: 346
Don't bother with using the DataRecieve handler, it's horribly inaccurate, you're better off to start a thread which constantly reads the serial port and grabs every byte which comes across it.
Upvotes: 3
Reputation: 13533
When you create your SerialPort:
SerialPort comport = new SerialPort("COM1");
comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// Shortened and error checking removed for brevity...
if (!comport.IsOpen) return;
int bytes = comport.BytesToRead;
byte[] buffer = new byte[bytes];
comport.Read(buffer, 0, bytes);
HandleSerialData(buffer);
}
//private void ReadStoreArray(byte[] respBuffer)
private void HandleSerialData(byte[] respBuffer)
{
//I want to take what is in the buffer and combine it with another array
byte [] AddOn = {0x01, 0x02}
byte [] Combo = {AddOn[1], AddOn[2], respBuffer[0], ...};
}
Upvotes: 8
Reputation: 283624
You can't read the same data from the port twice. You'll need to read it once into a buffer, then either share the buffer (pass as a function parameter) or clone it to give each function its own copy.
Upvotes: 1