串行端口写究竟如何实际从缓冲区写数据?

时间:2018-09-19 21:25:57

标签: c# c++ .net winforms arduino

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

port.Write Information from the Microsoft page

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

  1. 数据传输的准确度如何?从MS页面开始,因为它说“它使用来自缓冲区的数据将指定数量的字节写入串行端口”,我假设它是同时发送所有字节的,而不是单独发送的。

    i.e如果我以port.Write(new byte[] { b0, b1, b2, b3, b4, b5, b6, b7}, 0, 8);的形式发送数据,是基本上一次发送所有8个字节,还是单独发送每个元素,如果是,字节之间的终止是什么?我认为这是第一个,因为它要求写入的字节数(计数),因此它从数组发送8个字节。

  2. 在传输期间在字节之间终止的是什么?逗号分隔数组数据,但在传输时,它是否甚至发送逗号来终止或只是数据流?

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

  3. 在C ++中的Arduino上,您可以使用Serial.print或Serial.println使它自动应用新行。在MS页面上,WriteLine方法仅写入一个字符串,并且没有任何重载,因此我认为这意味着无法通过此命令使用字节吗?

  4. 如果我尝试使用for循环打印单个数组,则说无法从byte转换为char[]。当我将其定义为字节数组时,为什么说它是一个char数组? 我以前使用/// port.Write(sendbyte, 0, 8);发送整个数组并获取了一些数据。

要从Windows Form 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 个答案:

答案 0 :(得分:2)

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

  2. 各个字节之间没有定界符。分隔数组字节的逗号实际上只是您编程语言的语法,即。它仅存在于您的代码文件中。字节总是按顺序排列在内存中。

  3. 否,除非将字节数组转换为字符串值。 How convert byte array to string

  4. 尝试port.Write(&sendByte [x],0,1);