c# SerialPort处理串口数据 开关量 模拟量数据
电流: 不计算校验
aa 01 01 02 03 04 05 06 07 08 bb 55
状态: 不计算校验
aa 01 00 00 00 00 bb 55
这是设备 发的数据帧, 电流和开关量状态混着发的, ,怎么获得完整的帧,我写的程序 单独接收可以,如果模拟量一块收到怎么弄,模拟量和开关量帧头 帧尾一样
怎么单独提取开关量帧
private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)//接收数据事件
{
try
{
byte[] buffer = new byte[100];
serialPort1.Read(buffer, 0, 100);
xianshi(buffer);
getFillcolor(buffer);
LOAD_ini(buffer);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
这是开关量状态的函数,最后根据状态画图
private void getFillcolor(byte[] inbyte)
{
Graphics g = groupBox7.CreateGraphics();
Graphics h = groupBox8.CreateGraphics();
if (inbyte[0] == 0xaa && inbyte[7] == 0x55&&inbyte[1]==0x01)
{
int j = 30;
for (int i = 0; i < 8; i++)
{
int d = inbyte[3] >> i & 0x01;
if (d == 0x01)
{
g.FillEllipse(Brushes.LightCyan, j, 30, 15, 15);
}
else if (d == 0)
{
g.FillEllipse(Brushes.Yellow, j, 30, 15, 15);
}
j = j + 50;
}
int k = 30;
for (int i = 0; i < 8; i++)
{
int e = inbyte[4] >> i & 0x01;
if (e == 0x01)
{
g.FillEllipse(Brushes.LightCyan, k, 70, 15, 15);
}
else if (e == 0)
{
g.FillEllipse(Brushes.Green, k, 70, 15, 15);
}
k = k + 50;
}
int l = 30;
for (int i = 0; i < 8; i++)
{
int f = inbyte[5] >> i & 0x01;
if (f == 0x01)
{
g.FillEllipse(Brushes.LightCyan, l, 110, 15, 15);
}
else if (f == 0)
{
g.FillEllipse(Brushes.Red, l, 110, 15, 15);
}
l = l + 50;
}
}