110,534
社区成员
发帖
与我相关
我的任务
分享
private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] ReDatas = new byte[ComDevice.BytesToRead];
ComDevice.Read(ReDatas, 0, ReDatas.Length);//读取数据
queue.Enqueue(ReDatas);
while (queue.Find())
{
byte[] readBuffer = new byte[38];
readBuffer = queue.Dequeue();
this.AddData(readBuffer);//输出十六进制原数据,输出字符数据
if(readBuffer[1] == 0x63)
this.AddData_D1(readBuffer);//输出十进制数据
else if(readBuffer[1] == 0x72)
this.AddData_D2(readBuffer);//输出校正后的十进制数据
}
}
class bytequeue
{
private List<byte> m_buffer = new List<byte>();
public bool Find()
{
if (m_buffer.Count == 0)
return false;
int HeadIndex = m_buffer.FindIndex(o => o == 0x6D);
if (HeadIndex == -1)
{
m_buffer.Clear();
return false; //没找到m
}
else if (HeadIndex != 0) //移除帧头前的数据
{
if (HeadIndex > 1)
m_buffer.RemoveRange(0, HeadIndex );
}
int length = 38;
if (m_buffer.Count < length)
{
return false;
}
int TailIndex = m_buffer.FindIndex(o => o == 0x0A); //查找55的位置
if (TailIndex == -1)
{
//这一步为防止连发一个AA开头的包后,没发55,而又发了一个AA
int head = m_buffer.FindLastIndex(o => o == 0xAA);
if (head > -1)
{
m_buffer.RemoveRange(0, head );
}
return false;
}
else if (TailIndex + 1 != length ) //计算包尾是否与包长度相等
{
m_buffer.RemoveRange(0, TailIndex);
return false;
}
return true;
}
/// <summary>
/// 数据长度
/// </summary>
/// <returns></returns>
/*public int GetLength()
{
if (m_buffer.Count >= 3)
{
byte[] len = new byte[2];
len[0] = m_buffer[1];
len[1] = m_buffer[2];
return BitConverter.ToInt16(len, 0);
}
return 0;
}*/
/// <summary>
/// 命令码
/// </summary>
/// <returns></returns>
/*public byte Cmd()
{
if (m_buffer.Count >= 4)
{
return m_buffer[3];
}
return 0;
}*/
/// <summary>
/// 提取数据
/// </summary>
public byte[] Dequeue()
{
int size = 38;
//m_buffer.RemoveRange(0,1);
//m_buffer.RemoveRange(76,1);
byte[] buffer = m_buffer.Take(size).ToArray();
m_buffer.RemoveRange(0, size);
return buffer;
}
/// <summary>
/// 队列数据
/// </summary>
/// <param name="buffer"></param>
public void Enqueue(byte[] buffer)
{
m_buffer.AddRange(buffer);
}
}
}