繁体   English   中英

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

[英]How exactly does Serial port write actually write the data from the buffer?

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

从Microsoft页面 port.Write 信息

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

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

    即如果我将数据作为port.Write(new byte[] { b0, b1, b2, b3, b4, b5, b6, b7}, 0, 8);发送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. 串行端口通常是缓冲的,但是Microsoft文档使我相信它会将整个缓冲区一次全部写到线路上,因为它可能会引发超时异常。 但是,如果您一次从窗口写入1000个字节,则不能保证在arduino的每个循环中读取相同数量的字节。

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

  3. 除非您将字节数组转换为字符串值,否则不会。 如何将字节数组转换为字符串

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM