当前位置: 首页 > 知识库问答 >
问题:

串行端口写入实际上是如何从缓冲区写入数据的?

巴学潞
2023-03-14

所以我使用Visual Studio Windows窗体创建GUI,以便将数据发送到Arduino。我一直在测试如何在Arduino端接收数据,但似乎找不到关于数据如何发送的解释。我一直在使用端口。Write()发送缓冲区。

端口。从Microsoft页面写入信息

Arduino串行监视器读取ASCII字符,但由于我使用GUI与Arduino通信,所以我不确定数据是如何传输的。在Arduino串行监视器中,我输入数据并按enter键。这意味着,如果我输入所有数据并按enter键,它将以1字节的形式读取所有数据。通过分别输入数据,然后输入enter,可以读取一个字节,并以换行符终止。

>

  • 数据到底是如何传输的?从MS页面来看,因为它说“使用缓冲区中的数据将指定数量的字节写入串行端口”,所以我假设它同时发送所有字节,而不是单独发送。

    i、 e如果我以端口发送数据。写入(新字节[]{b0,b1,b2,b3,b4,b5,b6,b7},0,8) 基本上是一次发送全部8个字节,还是单独发送每个元素,如果是,字节之间的终止是什么?我假设这是第一次,因为它要求写入(计数)字节数,所以它从数组中发送8个字节。

    在传输过程中,字节之间终止的是什么?逗号分隔数组数据,但在传输过程中,它是发送逗号终止还是只是一个数据流?

    例如,在我的串行监视器中,代码运行时,我分别输入每个字节,后跟换行符。然后,Arduino读取字节,直到遇到换行符

    在C中的Arduino上,您可以使用Serial.print或Serial.println让它自动应用新行。在MS页面上,WriteLine方法只写一个字符串,没有任何重载,所以我假设这意味着没有办法在这个命令中使用字节?

    如果我尝试使用for循环来打印单个数组,它会说无法从字节转换为字符[]。当我把它定义为字节数组时,为什么说它是一个字符数组?我之前使用的是//端口。写入(sendbyte,0,8)发送整个阵列并获取部分数据。

    要从Windows窗体GUI发送的代码:

    //bytes declared and data stored earlier
    byte[] sendbyte = new byte[] { b1, b2, b3, b4, b5, b6, b7, b8};
                
    port = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
    port.Open();
    //port.Write(sendbyte, 0, 8);
    
    port.Write(new byte[] { b1, b2, b3, b4, b5, b6, b7, b8}, 0, 8);
    /*for( int x = 0; x <=7; x ++)
    {
        port.Write( sendbyte[x], 0, 1);
    } 
    */
    port.Close();
    

    读取传入字节的代码

    void recvBytesWithStartEndMarkers() {
        static boolean recvInProgress = false;
        static byte ndx = 0;
        byte startMarker = 42;
        byte endMarker = 24;
        byte rb;
        byte comp;
    
        while (Serial.available() > 0 && newData == false) 
        {
            rb = Serial.read();
            if (recvInProgress == true) 
            {
                if (rb != endMarker)
                {
                    receivedBytes[ndx] = rb;
                    ndx++;
                    if (ndx >= numBytes) 
                    {
                        ndx = numBytes - 1;
                    }
                }
                else 
                {
                    receivedBytes[ndx] = ','; // terminate the string
                    recvInProgress = false;
                    numReceived = ndx;  // save the number for use when printing
                    ndx = 0;
                    newData = true;
                }
            }
            else if (rb == startMarker) 
            {
                recvInProgress = true;
            }
        }
    }
    

  • 共有1个答案

    宋原
    2023-03-14

    >

  • 串行端口通常是缓冲的,但微软的文档让我相信它会将整个缓冲区一次写入线路,因为它可能引发超时异常。但是,如果一次从windows写入1000字节,则不能保证在arduino上的每个循环中读取相同数量的字节。

    单个字节之间没有分隔符。分隔数组字节的逗号实际上只是编程语言的语法,也就是说,它只存在于代码文件中。字节在内存中总是按顺序排列的。

    除非您将字节数组强制转换为字符串值。如何将字节数组转换为字符串

    试试port。写(

  •  类似资料:
    • 我想通过Android中的media player对象播放现场流媒体。 因此,我计划从源读取缓冲区数据,并将其写入媒体播放器的缓冲区,请注意,我不会使用任何URL为媒体播放器的流源,音频缓冲区数据将以字节形式通过输入流接收。 到目前为止,我可以使用音频跟踪对象,但该方法只适用于未压缩的PCM数据

    • 下面的代码尝试使用缓冲区将WAV文件的头写入流,然后将其写入可写流。 出于某种原因,文件的前8个字节是错误的: 第一行应该是: 这条线路有故障: 它需要:

    • 我正在尝试向arduino的串行监视器发送一些数据,并使led亮起,但我还无法获取它。我的代码中有什么问题请检查这里是arduino代码 下面是java代码

    • 每个人 我试图通过Python从中继板控制中继,并编写以下代码。不幸的是,我总是出错。有人能告诉我我做错了什么吗?对于构造,我链接了文档(参见第二个链接)。我还发现了另一个帖子,其中有人试图从中继板读取数据(参见第一个链接)。但是代码对我也不起作用。 致以最诚挚的问候 翻译为www.DeepL。com/Translator 有用信息 stackoverflow关于从Velleman K8090读取

    • (这与(或者相反)如果有足够的数据,FileChannel.read读取的字节会比指定的少吗?) TL;博士: 这会一直写入整个缓冲区吗。。。 ...或者有必要使用这样的循环: ? 由于另一个答案中的评论,我想问一下,通过调用向写入

    • 问题内容: 从Windows,我可以使用以下命令与串行端口设备进行通信: 设备开始请求的操作。 当我尝试从独立的debian盒子或同一Windows机器的debian virtualbox实例完成相同的操作时,到目前为止我还没有运气。 这是等效的linux命令(至少我这样认为) 什么都没发生。 有人可以指导我正确的方向吗? 问题答案: 不会被解释,并且会按字面意义将字符串写入(并添加换行符)到指定