C#用serialPort实现串口通信读取byte数据菜鸟求助。
已知发送过来的是二进制数据,有一定格式:首先是个8bit(一字节?)的数字,表示后面的长度,例如00010001……表示后面还有17字节的内容,17字节里1.2字节没用,...
已知发送过来的是二进制数据,有一定格式:
首先是个 8 bit(一字节?)的 数字,表示后面的长度,例如00010001……表示后面还有17字节的内容,17字节里1.2字节没用,3.4要截取出来,5没用,7~17有用……
serialPort1.Read() serialPort1.ReadLine()神马的不大会用啊。
serialPort.DataRecived()事件用起来也怪怪的。
到底怎么读啊~~o(>_<)o ~~ 展开
首先是个 8 bit(一字节?)的 数字,表示后面的长度,例如00010001……表示后面还有17字节的内容,17字节里1.2字节没用,3.4要截取出来,5没用,7~17有用……
serialPort1.Read() serialPort1.ReadLine()神马的不大会用啊。
serialPort.DataRecived()事件用起来也怪怪的。
到底怎么读啊~~o(>_<)o ~~ 展开
2个回答
展开全部
class Program
{
struct BinData
{
public byte Length; //长度 8bit
public byte[] Header; // 1,2 字节没用
public byte[] Flag;// 3,4 字节截出来
public byte Padding; // 5没用
public byte[] Data; // 7~17 有用
}
static void Main(string[] args)
{
SerialPort sp = new SerialPort("COM3");
sp.Open();
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); //注册DataReceived事件,当收到数据时调用 sp_DataReceived
while (true) { }
}
static void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = (SerialPort)sender;
byte[] buf = new byte[port.ReadBufferSize];
int len = 0;
//将数据读入内存流
MemoryStream ms = new MemoryStream();
len = port.Read(buf, 0, buf.Length);
ms.Write(buf, 0, len);
buf = ms.ToArray();
FormatData(buf); //处理数据
}
static BinData FormatData(byte[] buf)
{
BinData d = new BinData();
d.Length = buf[0];//第一字节 长度
d.Header = new byte[2] { buf[1], buf[2] }; //1,2字节没用
d.Flag = new byte[2] { buf[3], buf[4] }; // 3,4 字节截出来
d.Padding = buf[5]; //5没用
byte[] data = new byte[d.Length - 7];
Buffer.BlockCopy(buf, 7, data, 0, d.Length - 7); //截取7~长度-7 数据
d.Data = data;
return d;
}
}
{
struct BinData
{
public byte Length; //长度 8bit
public byte[] Header; // 1,2 字节没用
public byte[] Flag;// 3,4 字节截出来
public byte Padding; // 5没用
public byte[] Data; // 7~17 有用
}
static void Main(string[] args)
{
SerialPort sp = new SerialPort("COM3");
sp.Open();
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); //注册DataReceived事件,当收到数据时调用 sp_DataReceived
while (true) { }
}
static void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = (SerialPort)sender;
byte[] buf = new byte[port.ReadBufferSize];
int len = 0;
//将数据读入内存流
MemoryStream ms = new MemoryStream();
len = port.Read(buf, 0, buf.Length);
ms.Write(buf, 0, len);
buf = ms.ToArray();
FormatData(buf); //处理数据
}
static BinData FormatData(byte[] buf)
{
BinData d = new BinData();
d.Length = buf[0];//第一字节 长度
d.Header = new byte[2] { buf[1], buf[2] }; //1,2字节没用
d.Flag = new byte[2] { buf[3], buf[4] }; // 3,4 字节截出来
d.Padding = buf[5]; //5没用
byte[] data = new byte[d.Length - 7];
Buffer.BlockCopy(buf, 7, data, 0, d.Length - 7); //截取7~长度-7 数据
d.Data = data;
return d;
}
}
追问
恩。看着挺靠谱。我试试。谢谢赐教。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询