我通过以下代码从串口获得响应。
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.然后,当我收到下一个数据块时,我不想检查标题,而是查看日期和时间等下一个信息。
基本上我想解析传入的数据包。
任何人都可以举一个小例子。这将非常有用。
感谢。
答案 0 :(得分:0)
我使用StringBuilder
来构建我的字符串。在您的情况下,您正在使用字节,也许您可以使用全局byte[]
数组。下面是<LF>
表示我收到整条信息的示例。我将字符附加到我的字符串,直到我知道我有完整的消息。我快速清除缓冲区,因为您在评估时可以进入下一个字符串。
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);
}
}
}
获得完整信息后,您可以根据需要对其进行评估。在我的示例中,我的消息以逗号分隔,因此我可以使用逗号作为分隔符将我的字符串拆分为字符串数组,并从消息中获取每个值。
public void Eval_String(string s)
{
string[] eachParam;
eachParam = s.Split(',');
if (eachParam.Length == 5)
{
//do something
Console.WriteLine(eachParam[2]);
}
}