c# SerialPort处理串口数据 开关量 模拟量数据

buwenpeng 2016-05-31 10:43:11
电流: 不计算校验
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;

}

}
...全文
457 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
小程序员 2016-06-02
  • 打赏
  • 举报
回复
引用 5 楼 buwenpeng 的回复:
[quote=引用 4 楼 huang461072830 的回复:] 第一步:根据其实符和结束符提取一帧数据(当然,需要再你帧内容没有与起始符结束符相同的东西,有的话还要判断帧长度) 第二步:根据控制码获取当前帧的类型 根据你的协议: 电流: 不计算校验 aa 01 01 02 03 04 05 06 07 08 bb 55 状态: 不计算校验 aa 01 00 00 00 00 bb 55 起始符可能是aa 01 结束符可能是 bb 55两位 那么byte[3]有可能是控制符,也就是说byte[3]是01的时候是电流byte[3]是00的时候是状态,就可以根据这个判断要不要处理,怎么处理,当然,具体的要问定这个协议的人,把协议拿到,根据协议去做包分析
aa是帧头 55是帧尾 01是设备地址码 这个设备有很多办卡 地址可以是02 03 等 bb是校验 我不用 这设备要求不是太高 不管校验了 [/quote] 控制码多少,这个才是关键,提取出帧后就是根据控制码来做操作的
拜一刀 2016-06-01
  • 打赏
  • 举报
回复
按照包头包尾接收,加个长度的判断咯?
把分全给哥 2016-06-01
  • 打赏
  • 举报
回复
引用 1 楼 devmiao 的回复:
http://blog.sina.com.cn/s/blog_7678e1a60101hso3.html
大神
buwenpeng 2016-06-01
  • 打赏
  • 举报
回复
引用 1 楼 devmiao 的回复:
http://blog.sina.com.cn/s/blog_7678e1a60101hso3.html
http://www.cnblogs.com/Sue_/articles/2012335.html我觉得这个好些
buwenpeng 2016-06-01
  • 打赏
  • 举报
回复
引用 3 楼 zeratul1990 的回复:
按照包头包尾接收,加个长度的判断咯?
需要单独从缓冲区,截取完整的帧 放至另外缓冲区吗, 电流和电压需要 各自弄个缓冲区?
buwenpeng 2016-06-01
  • 打赏
  • 举报
回复
引用 4 楼 huang461072830 的回复:
第一步:根据其实符和结束符提取一帧数据(当然,需要再你帧内容没有与起始符结束符相同的东西,有的话还要判断帧长度) 第二步:根据控制码获取当前帧的类型 根据你的协议: 电流: 不计算校验 aa 01 01 02 03 04 05 06 07 08 bb 55 状态: 不计算校验 aa 01 00 00 00 00 bb 55 起始符可能是aa 01 结束符可能是 bb 55两位 那么byte[3]有可能是控制符,也就是说byte[3]是01的时候是电流byte[3]是00的时候是状态,就可以根据这个判断要不要处理,怎么处理,当然,具体的要问定这个协议的人,把协议拿到,根据协议去做包分析
aa是帧头 55是帧尾 01是设备地址码 这个设备有很多办卡 地址可以是02 03 等 bb是校验 我不用 这设备要求不是太高 不管校验了
小程序员 2016-06-01
  • 打赏
  • 举报
回复 1
第一步:根据其实符和结束符提取一帧数据(当然,需要再你帧内容没有与起始符结束符相同的东西,有的话还要判断帧长度) 第二步:根据控制码获取当前帧的类型 根据你的协议: 电流: 不计算校验 aa 01 01 02 03 04 05 06 07 08 bb 55 状态: 不计算校验 aa 01 00 00 00 00 bb 55 起始符可能是aa 01 结束符可能是 bb 55两位 那么byte[3]有可能是控制符,也就是说byte[3]是01的时候是电流byte[3]是00的时候是状态,就可以根据这个判断要不要处理,怎么处理,当然,具体的要问定这个协议的人,把协议拿到,根据协议去做包分析
devmiao 2016-05-31
  • 打赏
  • 举报
回复
http://blog.sina.com.cn/s/blog_7678e1a60101hso3.html

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧