Поэтому я использую форму Visual Studios для Windows, чтобы создать графический интерфейс для отправки данных в Arduino.Я проверял, как получать данные на стороне Arduino, и я не могу найти объяснение того, как данные отправляются.Я использовал port.Write()
для отправки в буфер.
port.Write
Информация со страницы Microsoft
Arduino Serial Monitor читает символы ASCII, но, поскольку я использую графический интерфейс для связи с Arduino, я неточно уверен, как данные передаются.В Arduino Serial Monitor я ввожу данные и нажимаю ввод.Это означает, что если я ввожу все свои данные и нажимаю ввод, он считывает все данные как 1 байт.При вводе данных по отдельности с последующим вводом это читаемый байт, который завершается символом новой строки.
Как точно передаются данные?Со страницы MS, поскольку он говорит, что «записывает указанное число байтов в последовательный порт, используя данные из буфера», я предполагаю, что он отправляет все байты одновременно, а не по отдельности.
то есть, если я отправляю данные как port.Write(new byte[] { b0, b1, b2, b3, b4, b5, b6, b7}, 0, 8);
, отправляет ли это в основном все 8 байтов одновременно или отправляет каждый элемент индивидуально, если да, каково завершение между байтами?Я бы предположил, что это первое, так как он запрашивает количество байтов для записи (подсчета), поэтому он отправляет 8 байтов из массива.
Что заканчивается между байтами во время передачи?Запятая разделяет данные массива, но при передаче отправляет ли даже запятые для завершения или это просто поток данных?
т.е.В моем последовательном мониторе с запуском кода я вписываю каждый байт индивидуально, за которым следует символ новой строки.Затем Arduino читает байт, пока не встретит символ новой строки
В Arduino в C ++ вы можете использовать Serial.print или Serial.println, чтобы он автоматически применял новую строку.На странице MS метод WriteLine только записывает строку и не имеет никаких перегрузок, поэтому я предполагаю, что это означает, что невозможно использовать байт с этой командой?
Если я попытаюсьиспользуйте цикл 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;
}
}
}