第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

C# Serial Port Read - 獲取不同長(zhǎng)度的 COBS 編碼消息

C# Serial Port Read - 獲取不同長(zhǎng)度的 COBS 編碼消息

C#
哈士奇WWW 2022-10-23 16:06:31
所以我是 C# 編程的新手。我在 Visual Studio 中編寫了一個(gè) C# Forms 應(yīng)用程序,以通過(guò)串行端口與設(shè)備通信/初始化設(shè)備。設(shè)備之間的通信是 COBS 編碼的,因此除了每條消息的末尾之外沒有 0x00 字節(jié)。發(fā)送和接收的消息長(zhǎng)度不同。目前我的問(wèn)題是,我收到的消息不完整或在消息中間開始,所以我無(wú)法在收到的消息中觸發(fā)特定值的發(fā)送消息。您可以使用收到的 0x00 確定消息的結(jié)尾(0x00 表示 COBS 編碼數(shù)據(jù)中的消息結(jié)尾)所以我需要一些東西來(lái)處理完整的消息并將它放在一個(gè)字節(jié)數(shù)組中來(lái)分析一個(gè)特定的值,即字節(jié)[11]。這是我到目前為止所做的:    private bool   b_portopen = false;    private byte[] b_rcv_buffer = new byte[256];    private void button1_Click(object sender, EventArgs e) {            //InitTimer();            if (b_portopen == false)            {                serialPort1.PortName = comboBox1.SelectedItem.ToString();                serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);                serialPort1.Open();                b_portopen = true;                button1.Text = "Close";                button2.Enabled = true;                Console.WriteLine("Serial Port Opened");            }            else if (b_portopen == true)            {                serialPort1.Close();                b_portopen = false;                button1.Text = "Open";                button2.Enabled = false;                Console.WriteLine("Serial Port Closed");            }        }private async void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)        {            serialPort1.Read(b_rcv_buffer, 0, 256);            //serialPort1.Read(b_rcv_buffer1, 11, 2);            richTextBox1_receive.Invoke(new Action(() =>            {                richTextBox1_receive.AppendText(BitConverter.ToString(b_rcv_buffer) + "\n");                richTextBox1_receive.ScrollToCaret();            }));            switch (b_rcv_buffer[10])            {                case b_state_startup:                    do something                case b_state_be_start_conf:                    do something            }        }
查看完整描述

1 回答

?
侃侃爾雅

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超16個(gè)贊

所以,我找到了使用 ConcurrentQueue 的解決方案:


    ConcurrentQueue<byte> b_rcv_buffer = new ConcurrentQueue<byte>();


    private Timer timer2;


    public void InitTimer()

            {

                timer2 = new System.Windows.Forms.Timer();

                timer2.Tick += new EventHandler(timer2_Tick);

                timer2.Interval = 1; // in miliseconds

                timer2.Start();

            }


    private async void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)

        {

            int bytes = serialPort1.BytesToRead;

            byte[] buf = new byte[bytes];

            serialPort1.Read(buf, 0, serialPort1.BytesToRead);


            for(int i = 0; i < buf.Length; i++)

            {

                b_rcv_buffer.Enqueue(buf[i]); //Enqueue every received Byte in Concurrentqueue

            }

        }


private async void timer2_Tick(object sender, EventArgs e)

        {

            if (b_rcv_buffer.Contains<byte>(0x00))

            {

                byte[] array = b_rcv_buffer.ToArray();


                richTextBox1_receive.Invoke(new Action(() =>

                {

                    richTextBox1_receive.AppendText(BitConverter.ToString(array) + "\n");

                    //richTextBox1_receive.ScrollToCaret();

                }));            


                byte ignored;


                while (b_rcv_buffer.TryDequeue(out ignored));

        }


查看完整回答
反對(duì) 回復(fù) 2022-10-23
  • 1 回答
  • 0 關(guān)注
  • 253 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)