首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >解析从串口接收到的数据包

解析从串口接收到的数据包
EN

Stack Overflow用户
提问于 2018-06-04 13:10:17
回答 1查看 1.6K关注 0票数 0

我正在通过下面的代码从串口获得响应。

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SerialPortHexCommunication
{
public class Program
{
    static void Main(string[] args)
    {
        SerialPort port = new SerialPort();
        port.PortName = "COM5";
        port.Parity = Parity.None;
        port.BaudRate = 9600;
        port.DataBits = 8;
        port.StopBits = StopBits.One;

        if (port.IsOpen)
        {
            port.Close();
            port.Dispose();
        }
         port.Open();

        byte[] bytesToSend = new byte[6] { 0xD0, 0xF2, 0xFF, 0x00, 0x06, 0xC7 };

        port.Write(bytesToSend, 0, bytesToSend.Length);
        port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

        Console.ReadKey();
        port.Close();
        port.Dispose();

    }

    private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        Console.WriteLine("Data receive at time "+ DateTime.Now.TimeOfDay);
        SerialPort port = (SerialPort)sender;

        int bytes = port.BytesToRead;
        byte[] buffer = new byte[bytes];

        if (port.BytesToRead > 1)
        {
            port.Read(buffer, 0, bytes);
        }

        foreach (byte item in buffer)
        {
            Console.WriteLine(item);
        }
    }
}
}

输出基本上是字节的dec表示,连接到串行端口的硬件以以下格式发送它: E0、F2、设备id、2字节长度、当前日期、当前时间(通过右移和一些其他数据,将当前日期和当前时间都存储在超过2个字节的范围内)

我接收的数据是分块的,有时是4字节,有时是8字节。我想要做的是1.我想首先检查我在该数据包中接收到的内容,如报头2。然后,当我接收到下一个数据块时,我不想检查报头,而是检查下一个信息,如日期和时间等等。

基本上,我想解析传入的数据包。

能不能请大家给一个小的example.It会真的很有帮助。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-06-06 05:56:16

我使用StringBuilder来构建我的字符串。在您的例子中,您使用的是字节,也许您可以使用全局byte[]数组。下面是一个例子,其中<LF>表示我得到了整个消息。我会将字符附加到字符串中,直到我知道了整个消息。我很快地清除了缓冲区,因为你的下一个字符串可以在你求值的时候进来。

代码语言:javascript
复制
StringBuilder sb = new StringBuilder();
char LF = (char)10;

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    string Data = serialPort1.ReadExisting();

    foreach (char c in Data)
    {
        if (c == LF)
        {
            sb.Append(c);

            CurrentLine = sb.ToString();
            sb.Clear();

            //do something with your response 'CurrentLine'
            Eval_String(CurrentLine);
        }
        else
        {
            sb.Append(c);
        }
    }
}

一旦你得到了完整的信息,你就可以评估你所需要的东西。在我的示例中,我的消息返回逗号分隔,因此我可以使用逗号作为分隔符将字符串拆分为字符串数组,并从消息中获取每个值。

代码语言:javascript
复制
public void Eval_String(string s)
{
    string[] eachParam;
    eachParam = s.Split(',');

    if (eachParam.Length == 5)
    {
        //do something
        Console.WriteLine(eachParam[2]);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50673722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档