I am making a serial program with c#, windowform.
When I send a message to my device, my program receives only part of the response.
When I tried with ComPortMaster, I got what I expected(c0 06 02 43 6d 00 2a c1 c0 08 02 6d 00 01 20 00 46 c1).
But in my program, it only shows me “c0 06 02 43 6d 00 2a”, first part of the response.
I set the baud rate, parity, data bit, etc.
ComPortMaster setting. Baudrate 2400, databit 8, stopbit 1, parity odd
In my code,
openSerial(cbxComport.SelectedItem.ToString(), 2400, 8, StopBits.One, Parity.Odd);
I also set buffer size and timeout.
serialPort1.ReadBufferSize = 8192;
serialPort1.WriteBufferSize = 8192;
serialPort1.ReadTimeout = 5000;
serialPort1.WriteTimeout = 1000;
To get data, I used this.
serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
this.Invoke(new EventHandler(MySerialReceived1));
}
void MySerialReceived1(object s, EventArgs e)
{
int RecvSize = serialPort1.BytesToRead;
byte[] data = new byte[RecvSize];
serialPort1.Read(data, 0, RecvSize);
AppendLog(DateTime.Now.ToString("HH:m:ss:fff") + " raw[" + RecvSize + "] : " + Util.ByteToString(data) + Environment.NewLine);
//I sent data to another method, so that I can get a full packet.
//I tried without this part, still message stopped
SerialControl.recieveData(data);
if (SerialControl.finishedFlag)
{
byte[] recieved = SerialControl.GetRecieved();
string msg = Util.ByteToString(recieved);
txtRecieved.Text = msg;
tbLog.AppendText("Received : " + msg + Environment.NewLine);
classifyData(recieved);
}
}
But I got was
sent : c0 6 2 43 6d 0 2a c1
15:25:05:809 raw[5] : c0 6 2 43 6d
15:25:05:856 raw[2] : 0 2a
it always stop at c1.
This is my SerialControl class.
The response will be get echo and response both. So it think first one as echo, and the second one as response.
public static class SerialControl
{
public static SerialPort serialPort = new SerialPort();
public static bool recieveFlag = false, finishedFlag = false, echoFlag = false;
public static byte startByte = 0x7E, endByte = 0xE7;
public static List<byte> echoArr = new List<byte>();
public static List<byte> dataArr = new List<byte>();
public static List<byte> recieveArr = new List<byte>();
public static void sendData(byte[] data)
{
serialPort.Write(data, 0, data.Length);
}
public static void Clear()
{
finishedFlag = false;
recieveFlag = false;
recieveArr.Clear();
dataArr.Clear();
echoArr.Clear();
return;
}
public static void recieveData(byte[] data)
{
if (finishedFlag) return;
int startIndex = Array.IndexOf(data, startByte);
int endIndex = Array.LastIndexOf(data, endByte);
if (recieveFlag) // receiving
{
//save all of data
recieveArr.AddRange(data);
finishedFlag = false;
recieveArr.AddRange(Util.sliceArray(data,0,endIndex));
}
else {//did not recieve yet
if (startIndex == -1)
{
return;
}
else // stx exist
{
//save all of data
recieveArr.AddRange(data);
recieveFlag = true;
finishedFlag = false;
}
}
//check received data
endIndex = recieveArr.IndexOf(endByte);
if (!echoFlag && endIndex > -1) //did not get echo yet
{
Console.WriteLine("ehco check");
echoArr = recieveArr.GetRange(0, endIndex + 1) ;
echoFlag = true ;
recieveArr.RemoveRange(0, endIndex + 1);
}
//already have echo
endIndex = recieveArr.IndexOf(endByte);
Console.WriteLine("data endIndex:"+endIndex);
if (echoFlag) {
if (endIndex > -1) {
Console.WriteLine("datacheck");
dataArr = recieveArr.GetRange(0, endIndex + 1) ;
finishedFlag = true ;
recieveFlag = false ;
}
}
}
public static byte[] GetRecieved()
{
if (finishedFlag)
{
byte[] result = dataArr.ToArray();
finishedFlag = false;
recieveFlag = false;
recieveArr.Clear();
dataArr.Clear();
echoArr.Clear();
return result;
}
else return null;
}
public static byte[] GetEcho() {
if (echoFlag)
{
byte[] result = echoArr.ToArray();
return result;
}
else return null;
}
}
jae is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
10
I had a similar problem – i had to put a loop in place when receiving the data
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Console.WriteLine("Delegate Fired Reading Port Now");
do
{
int result = 0;
try
{
result = SerialPort.ReadByte();
}
catch (Exception ex)
{
}
if (result != 0)
{
Console.WriteLine($"Byte Read {result}");
BytesReceivedCount++;
VersionString = String.Concat(VersionString, result);
}
else
{
ReadSerialPort = false;
}
}
while (ReadSerialPort == true);
}