Как именно последовательный порт записи на самом деле записывает данные из буфера? - PullRequest
0 голосов
/ 20 сентября 2018

Поэтому я использую форму Visual Studios для Windows, чтобы создать графический интерфейс для отправки данных в Arduino.Я проверял, как получать данные на стороне Arduino, и я не могу найти объяснение того, как данные отправляются.Я использовал port.Write() для отправки в буфер.

port.Write Информация со страницы Microsoft

Arduino Serial Monitor читает символы ASCII, но, поскольку я использую графический интерфейс для связи с Arduino, я неточно уверен, как данные передаются.В Arduino Serial Monitor я ввожу данные и нажимаю ввод.Это означает, что если я ввожу все свои данные и нажимаю ввод, он считывает все данные как 1 байт.При вводе данных по отдельности с последующим вводом это читаемый байт, который завершается символом новой строки.

  1. Как точно передаются данные?Со страницы MS, поскольку он говорит, что «записывает указанное число байтов в последовательный порт, используя данные из буфера», я предполагаю, что он отправляет все байты одновременно, а не по отдельности.

    то есть, если я отправляю данные как port.Write(new byte[] { b0, b1, b2, b3, b4, b5, b6, b7}, 0, 8);, отправляет ли это в основном все 8 байтов одновременно или отправляет каждый элемент индивидуально, если да, каково завершение между байтами?Я бы предположил, что это первое, так как он запрашивает количество байтов для записи (подсчета), поэтому он отправляет 8 байтов из массива.

  2. Что заканчивается между байтами во время передачи?Запятая разделяет данные массива, но при передаче отправляет ли даже запятые для завершения или это просто поток данных?

    т.е.В моем последовательном мониторе с запуском кода я вписываю каждый байт индивидуально, за которым следует символ новой строки.Затем Arduino читает байт, пока не встретит символ новой строки

  3. В Arduino в C ++ вы можете использовать Serial.print или Serial.println, чтобы он автоматически применял новую строку.На странице MS метод WriteLine только записывает строку и не имеет никаких перегрузок, поэтому я предполагаю, что это означает, что невозможно использовать байт с этой командой?

  4. Если я попытаюсьиспользуйте цикл for для печати отдельного массива, он говорит, что не может конвертировать из byte в 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 голосов
/ 20 сентября 2018
  1. Обычно последовательные порты буферизируются, но документация Microsoft заставляет меня полагать, что он записывает весь буфер сразу в провод, поскольку он может вызвать исключение тайм-аута.Однако, если вы пишете 1000 байтов из окон за один раз, вам не гарантируется чтение одинакового количества байтов в каждом цикле в arduino.

  2. Нет разделителя между отдельными байтами.Запятая, разделяющая байты массива, на самом деле является только синтаксисом вашего языка программирования, т.е.он существует только в вашем кодовом файле.Байты всегда располагаются последовательно в памяти.

  3. Нет, если вы не приведете байтовый массив к строковому значению. Как преобразовать байтовый массив в строку

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...