首页 > 解决方案 > C# - 需要 SerialPort 编码帮助

问题描述

我的程序需要帮助,我想同时从多个微控制器读取代码并将它们翻译成纯文本。只有一个串行接口可以收集所有代码。代码的翻译工作,但我有代码读取不正确的问题。他一次又一次地在没有间隙和有间隙的地方停顿(500 微秒)。他并不总是能正确识别它们。

以下是部分代码:

public byte[] block = new byte[4096];
        public int posBlock = 0;

        public void Read(object sender, SerialDataReceivedEventArgs e)
        {
            console_.WriteLine("--------------------------------------------------");
            console_.WriteLine("Void: Read(object sender, SerialDataReceivedEventArgs e)");
            int offset = 0, count = serialPort.BytesToRead, i = 0;
            byte[] rd = new byte[count];

            serialPort.Read(rd, offset, count);

            for (int buffer = 0; buffer < count; buffer++) { block[posBlock + buffer] = rd[buffer]; i = buffer; }
            i++;
            posBlock += i;
            string rcpausgabe = null;
            for (int i2 = 0; i2 < posBlock; i2++) { rcpausgabe += " " + (int)(block[i2]); }
            //WriteProtocol(global_.variables.protocol_other, rcpausgabe, true);
            console_.WriteLine("ReadCode: " + rcpausgabe);
            if (IsDecode == false) { Zersetzten(); } else { console_.WriteLine("Add but not Zersetzen()"); }
            IsDecode = false;
            console_.WriteLine("--------------------------------------------------");
        }

        bool IsDecode = true;
        public int ib = 0;
        public string bs = null;

        private void Zersetzten()
        {
            IsDecode = true;
            console_.WriteLine("--------------------------------------------------");
            console_.WriteLine("Void: Zersetzten()");

            byte[] b = new byte[4096];

            while (!(ib >= posBlock))
            {
                for (int i7 = 0; i7 < b[1] + 3; i7++)
                {
                    string rcpausgabe1 = null;
                    b[i7] = block[ib];
                    ib++;;
                    if (i7+1 == (b[1] + 3))
                    {
                        Thread.Sleep(500);
                        console_.WriteLine("Decoding b");
                        for (int i2 = 0; i2 < b[1]+3; i2++) { rcpausgabe1 += " " + (int)(b[i2]); }
                        console_.WriteLine("Decoding Code: " + rcpausgabe1);
                        bs = rcpausgabe1;                        
                        Decoding(b);
                    }                    
                }
            }
            IsDecode = false;
            block = new byte[4096];
            posBlock = 0;
            ib = posBlock;
            console_.WriteLine("--------------------------------------------------");
        }

我已经编写了自己的控制台 (console_) 来帮助我解决这个问题,这让我可以实时跟踪所有进程。

我也提前感谢大家的回答。

(我用 Pons 翻译器翻译了这篇文章,因为我的英语不太好)

标签: c#visual-studiovisual-studio-2019

解决方案


我无法发表评论,所以我必须使用帖子来帮助您澄清您的问题。如果您可以提供更多详细信息,我将编辑我的答案。

  1. 让你的问题更清楚。

    你期待什么结果,你观察到什么样的现象。

  2. 最小的、可重复的例子

    显然Read(object sender, SerialDataReceivedEventArgs e)没有在您的帖子中调用。

    虽然您的问题正在阅读“暂停”,但正在调用哪段代码Read可能是必不可少的。

  3. 什么是“暂停”,什么是“间隙”。

    他在没有间隙和有间隙的地方一次又一次地停顿(500微秒。

    我只能猜测您的程序会在出现间隙时“暂停”,但不知道“间隙”和“暂停”是什么。

  4. 做什么for (int i7 = 0; i7 < b[1] + 3; i7++)for (int i2 = 0; i2 < b[1]+3; i2++)想要做什么?

    您正在使用 b[1] 进行索引,并且在您接收数据时 b[1] 已更改。

编辑:添加如何创建一个最小的、可重现的示例。Edit2:指出 for 循环中一段奇怪的代码。


推荐阅读