C#用serialPort实现串口通信读取byte数据菜鸟求助。

已知发送过来的是二进制数据,有一定格式:
首先是个 8 bit(一字节?)的 数字,表示后面的长度,例如00010001……表示后面还有17字节的内容,17字节里1.2字节没用,3.4要截取出来,5没用,7~17有用……
serialPort1.Read() serialPort1.ReadLine()神马的不大会用啊。
serialPort.DataRecived()事件用起来也怪怪的。
到底怎么读啊~~o(>_<)o ~~

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;
}
}追问

恩。看着挺靠谱。我试试。谢谢赐教。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-05-05

C#用serialPort实现串口通信读取byte数据菜鸟求助。
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 SerialData...

C# serialport内datareceived事件接收串口数据,详细步骤。
byte[] data = new byte[serialPort1.BytesToRead]; \/\/定义缓冲区,因为串口事件触发时有可能收到不止一个字节 serialPort1.Read(data, 0, data.Length);\/\/读取指定长度 foreach (byte Member in data) \/\/遍历用法 { string str = Convert.ToString(Member, 16).ToUpper();textBox1.AppendText...

c#如何实现串口通信读取数据
1. 直接调用SerialPort的静态方法GetPortNames()获取当前计算机的串行端口名称数组 2.根据串口名称,初始化SerialPort对象,设置参数,调用Open()方法打开串口 3.调用Write()方法发送数据 4.注册接收数据的监听,获取数据(或者另起线程循环读取接收数据,本文使用注册监听方式接收数据)具体代码实现 using Syste...

C# serialport类编写串口通信程序,无法接收全部数据!
bytesRead = serialPort.Read(BRecieve, 0, bytesToRead);楼上的说法有点意思,但是不完全透彻。其实问题在于串口返回数据时,它返回的速度可能不会太快,而程序执行是非常快的。也就是说,当执行到Read语句时,串口根本没来得及返回那么多的数据,如你说的,只返回了9个字节。即便你指定bytesToRead大小...

C#中的串口通信SerialPort
串口是计算机上的一种通用设备通讯协议,大多数计算机包含两个基于RS-232的串口。在仪器仪表设备中广泛应用,尤其用于获取远程设备采集的数据。串行接口电路负责将并行数据字符转换为连续的串行数据流,反之亦然。C#中的串口通讯使用的是System.IO.Ports.SerialPort类。通过简单操作步骤,很容易实现串口的信息...

C#中如何通过RS232的方式实现通信?
2.串口的通讯参数 串口通讯最常用的参数就是通讯端口号及通讯格式(波特率、数据位、停止位和校验位),在MSComm中相关的属性是CommPort和Settings。SerialPort类与MSComm有一些区别:a.通讯端口号 [PortName]属性获取或设置通信端口,包括但不限于所有可用的 COM 端口,请注意该属性返回类型为String,不是...

C# 串口通信 使用SerialPort类的DataReceived事件接收的数据不完整...
1.你可以在接收事件函数的开始位置延迟一段时间,根据数据长度的不同可以适当改变延迟的时间。2.根据你接收的数据格式可以使用不同的Read方法。ReadTo()方法是直到读到相应的字符为止,ReadLine()方法是读到一个新行,Read()读取缓冲区的字节数。希望对你有帮助。不懂的话可以继续问。

C# 串口通信,serialport里的数据只读了一部分。
一般来说判断从下位机接收数据的方式要么是根据超时判断数据接收完结,要么是根据接收到头尾标记。所以程序里通常你得循环的 read,然后然线程sleep个几毫秒,直到读不出数据或者读到数据包尾了再把之前读到的所有字节送出。你要是想偷懒的话干脆打开串口后等一个较长的时间再接收。那基本上就不会是你...

C# SerialPort配置和属性了解
SerialPort是串口进行数据通信的重要工具。本文将演示如何在VS2019中配置SerialPort进行通信。首先,确保你创建的是.NET框架的窗体应用。若工具箱中未找到SerialPort控件,检查应用类型是否正确。配置开始,关注SerialPort的属性。根据具体需求调整端口号、波特率、数据位等参数。针对示例,端口号设置为COM3;...

C# 串口通信时能收到数据,但是数据显示不出来,这个显示函数应该怎么写...
确定串口有接收到数据吗?输入缓冲区读取 int bytecount = serialPort1.BytesToRead;byte[] buf = new byte[bytecount];serialPort1.Read(buf, 0, bytecount);之后buf转换成要显示的内容

相似回答