C#-需要SerialPort编码帮助

时间:2020-02-05 07:31:31

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

我的程序需要帮助,我想同时从几个微控制器读取代码并将其转换为纯文本。只有一个串行接口可以收集所有代码。代码的翻译工作正常,但是我有一个问题,即代码读取不正确。他会在没有间隙和有间隙的地方(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转换器翻译了此文本,因为我的英语不太好)

2 个答案:

答案 0 :(得分:0)

我无法发表评论,因此我必须使用帖子来帮助您阐明您的问题。 如果您可以提供更多详细信息,我会进行修改。

  1. 使您的问题更清楚。

    您期望得到什么结果以及观察到什么样的现象。

  2. 制作minimal, reproducible example

    显然,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循环中指出一段奇怪的代码。

答案 1 :(得分:0)

我不确定您提供的代码有什么问题。

但是,您可以参考[C#, need to receive data from microcontroller从微控制器接收数据)

了解如何从微控制器获取数据。

相关问题