Порядок обратный при отражении / отладке - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь отправить данные из формы Windows VS в Arduino, но мои данные продолжают зеркально отображаться.Я не уверен, имеет ли это отношение к буферу.Если мое понимание правильное, оно не должно иметь ничего общего с буфером или с данными для чтения / записи кода, и это проблема синхронизации?Буфер похож на очередь системы.Поскольку это FIFO, порядок, в котором я инициализировался, он будет иметь тот же порядок.

Я нашел эту статью, но я не уверен, применима ли она.В этот пример о кольцевом буфере UART голова и хвост при объявлении имеют один и тот же элемент.Это относится к обычным буферам?Я предположил, что, поскольку это FIFO, голова и хвост не будут разделять один и тот же элемент.Эта статья о двойной буферизации , кажется, о чем я говорю, но я не думаю, что технически я использую 2 буфера?

Например,

String a = "1";
String b = "2";
String c = "3";
String d = "4";
String e = "5";
String f = "6";
String g = "7";
String h = "8";
String[] sendchar = new String [] {a, b, c, d, e, f, g, h};

Поэтому, когда я отправляю свои данные, поток буфера должен быть, справа будет первый элемент, а слева - последний;«h, g, f, e, d, c, b, a» a будет отправлено сначала, затем b и так далее.

В настоящее время, когда я отправляю данные, и они возвращаются, я получаю в обратном порядке, я отправлю «a, b, c, d, e, f, g, h», но получу «h», g, f, e, d, c, b, "возвращено".

Я получаю данные, читая их, а затем сохраняю в массив, дублирую, а затем получаю доступ к элементам вдублированный массив.Таким образом, порядок данных должен быть сохранен.

while (Serial.available() > 0 && newData == false)
{
    rb = Serial.read();

    if (rb != endMarker)
    {
        receivedChar[ndx] = rb;
        copyarray[ndx] = receivedChar[ndx];
            ndx++;

Как я получаю данные и отправляю их на Arduino

    void loop()
{
    recvWithEndMarkers();//get Data
    Serial.flush();//Clear Input buffer
    delay(10);//delay
    testblink();//Test blink
    //blink();
    echo();//echo data back
    Serial.flush();
    delay(2000);
}
void echo()
{
    for (int b = 0; b <= 7; b++)
    {
        Serial.write(copyarray[b]);// Send b'th element of array
        delay(50);
        Serial.write("\n");//newline character terminates read
    }


void recvWithEndMarkers() {
static boolean recvInProgress = false;
static byte ndx = 0;
char endMarker = '}';
byte rb;
byte comp;

while (Serial.available() > 0 && newData == false)
{
    rb = Serial.read();//read data from input buffer

    if (rb != endMarker)//not end marker
    {
        receivedChar[ndx] = rb;//store data into array index
        copyarray[ndx] = receivedChar[ndx];//copy data
        ndx++;//next index
        if (ndx >= numBytes)
        {
            ndx = numBytes - 1;
        }
    }
    else//endmarker
    {
        receivedChar[ndx] = '}'; // terminate the string
        recvInProgress = false;
        ndx = 0;//reset ndx
    }


    }
}

На стороне VS

port = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
        port.Open();
        for (int a = 0; a <= 7; a++)
        {
            port.Write(sendchar[a]);
            Thread.Sleep(50);
        }
        Thread.Sleep(50);
        port.DiscardOutBuffer();
        String[] recchar = new String[8];
        while (port.BytesToRead != 0)
        {

            for (int a = 0; a <= 7; a++)
            {
                recchar[a] = port.ReadLine();
                Thread.Sleep(50);
            }
        }
        port.DiscardInBuffer();

1 Ответ

0 голосов
/ 04 октября 2018

Я вижу как минимум пару проблем с вашим кодом.Во-первых, я предполагаю, что вы сбросили Arduino, а затем запустили программу Windows, верно?

ARDUINO:

  • Ваш recvWithEndMarkers (), вероятно, увидит Serial.available () == 0, так что немедленно выйдите из цикла while.
  • Когда вы помещаете символ в буфер, вы увеличиваете ndx (хорошо).Но когда ndx == numBytes, вы устанавливаете ndx на 7. Вероятно, он должен быть установлен на 0.
  • Кроме того, у вас есть ndx как «статический».Поэтому он сохранит свое значение, когда вы запустите его во второй раз - держу пари, что это не то, что вам нужно.
  • Когда вы выходите из функции recvWithEndMarkers (), вы выполняете serial.flush (), которыйможет привести к потере символов, особенно после первого раза.
  • Тогда ваша подпрограмма echo () будет «отправлять» все, что находится в copyarray [] на данный момент (не уверен на Arduino, если это 0 или 255, новероятно, не то, что вы ожидаете).
  • Если ваш код цикла имел сброс и задержку в верхней части цикла (и, возможно, дольше, чем 2 секунды), вы могли бы запустить Arduino, затем запустить программу VS, и, возможно,получить лучшие результаты.

Что касается VS, я не вижу ничего подобного, но вы не поделились кодом, который печатает полученные данные.

Удачи!

...