C#上的串行端口,读取到一个字节序列

C#上的串行端口,读取到一个字节序列,c#,arduino,serial-port,arduino-due,C#,Arduino,Serial Port,Arduino Due,我有一个来自COM端口的数据流。此流由30个字节组成。前26个字节是信息,后4个字节是一组0xFFF。例如,一组数组是[0xFF,0x5A,0x44,0x15,…,0x5F,0xFF,0xFF,0xFF,0xFF]。在前26个字节中,不可能得到类似的序列。 因此,我在C#中找不到任何方法来“读到”。 我用来读取串行数据的C代码是: public static int count; public static void Main() { SerialPort

我有一个来自COM端口的数据流。此流由30个字节组成。前26个字节是信息,后4个字节是一组
0xFFF
。例如,一组数组是
[0xFF,0x5A,0x44,0x15,…,0x5F,0xFF,0xFF,0xFF,0xFF]
。在前26个字节中,不可能得到类似的序列。
因此,我在C#中找不到任何方法来“读到”。 我用来读取串行数据的C代码是:

    public static int count;
    public static void Main()
    {
        SerialPort mySerialPort = new SerialPort("COM8");

        mySerialPort.BaudRate = 250000;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;

        mySerialPort.Handshake = Handshake.None;
        mySerialPort.DtrEnable = true;
        mySerialPort.RtsEnable = true;
        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

        mySerialPort.Open();

        count = 0;

        Console.WriteLine("Press any key to continue...");
        Console.WriteLine();

        Console.ReadKey();
        mySerialPort.Close();
    }


    private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        count++;
    }
是否有其他方法可以获得26个有趣字节的
列表
?考虑到数据在Arduino上,我可以编辑Arduino代码,我的Arduino每秒发送大约800字节集。如果您感兴趣,Arduino代码是(此时在Arduino到期下运行):

#定义最大ADC分辨率12
int-val;
无效设置(){
序列号:开始(250000);
模拟读取分辨率(最大ADC分辨率)//
adc_init(adc,SystemCoreClock,adc_FREQ_MAX*2,4);//~220000个采样/秒,A/D读数正常
val=0;
}
void loop(){
int start=millis();
int num_samples=0;//用于标识采样频率
而(毫秒()-开始<1000)
{
对于(int通道=0;通道>8));
串行写入(((无符号字符)(val&0x00FF));
}
串行写入((无符号字符)((num_samples&0xFF00)>>8));
串行写入((无符号字符)(num_samples&0x00FF));
串行写入(0xFF);
串行写入(0xFF);
串行写入(0xFF);
串行写入(0xFF);
num_samples++;
}
}
编辑以更好地解释我的问题:


如果我简单地设置缓冲读取的长度,我将得到传入流的一部分。因此,终端控制字节可以放置在字节数组中的任何位置(例如,我通常接收0x44、0x53、…、0xFF、0xFF、0xFF、0xFF、0xFF、…、0x55)。此外,假设接收的集合如下:0x22,…,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF。这是可能的,我的软件将剪切最后一个字节。

为什么不使用类似这样的读取:

byte[] buffer = new byte[30];
sp.Read(buffer, 0, 30);

通过这种方式,您可以获得字节数组,并可以测试您需要/不需要的值。

强烈建议,它为每个字节触发一个事件,并且比.net内置的事件更稳定。您需要缓冲读取的数据,以便可以在预期的30字节块中检查它。有关更多详细信息,请参见标记的复制,以及,,如果我只设置了缓冲读取的长度,则会得到传入流的一部分。因此,终端控制字节可以放在字节数组中的任何位置(例如,我通常接收0x44、0x53、…、0xFF、0xFF、0xFF、0xFF、0xFF、…、0x55)。当一次读取完成时,如果只读取了20个字节,而剩余的10个字节由于某种原因被保留,以后再读取,会发生什么情况?
byte[] buffer = new byte[30];
sp.Read(buffer, 0, 30);