Запрос, связанный с последовательной связью

У меня есть Raspberry Pi и Arduino. На моем Arduino я написал программу, если вы видите последние две функции, то есть getMove() и SendMove(), вы увидите, что я отправляю ход последовательно, и RPi прочитает строку только после того, как прочитает start. Он отправляет ее на RPi через последовательную связь с помощью USB (Примечание: как вы можете видеть, Arduino отправит строку только один раз, а не снова и снова, поскольку после отправки строки управление перейдет в getMove(), который ждет "Rstart").

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

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

Может ли кто-нибудь объяснить, как работает последовательная связь? Если я что-то отправляю с Arduino последовательно, оно всегда будет в последовательном буфере?

РЕДАКТИРОВАТЬ:
Я понял, что если контакт DTR последовательного разъема не отключен, Arduino будет постоянно сбрасываться при подключении к чему-то новому.

Теперь у меня вопрос: почему Arduino сбрасывается, когда я снова и снова запускаю код Python (для чтения последовательного буфера)?

КОД ARDUINO

#include "LiquidCrystal.h"

const int rs = 7, en = 6, d4 = 5, d5 = 4, d6 = 3, d7 = 2; // 4-битный режим
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int SensorValStore_Prev[8][8] = { {0,0,0,0,0,0,0,0}, \
                                  {0,0,0,0,0,0,0,0}, \
                                  {1,1,1,1,1,1,1,1}, \
                                  {1,1,1,1,1,1,1,1}, \
                                  {1,1,1,1,1,1,1,1}, \
                                  {1,1,1,1,1,1,1,1}, \
                                  {0,0,0,0,0,0,0,0}, \
                                  {0,0,0,0,0,0,0,0} };

int SensorValStore_Curr[8][8]={ {0,0,0,0,0,0,0,0}, \
                                {0,0,0,0,0,0,0,0}, \
                                {1,1,1,1,1,1,1,1}, \
                                {1,1,1,1,1,1,1,1}, \
                                {1,1,1,1,1,1,1,1}, \
                                {1,1,0,1,1,1,1,1}, \
                                {0,0,0,0,0,0,0,0}, \
                                {0,1,0,0,0,0,0,0} };
//int SensorValStore_Curr[8][8];
int sum1[8],sum2[8],temp[8][8],k,l,i,j,rank,nextRow;
String file,moveSan,Temp,bestMove;
char Buffer[20];
void doAction();
void ReadSensor();
void Difference();
void binToIntCalc();
void check();
void getMovePlayed();
void SendMove();
void getmove();

void setup()
{
  Serial.begin(9600);
  lcd.begin(16,2);
  pinMode(22,INPUT_PULLUP); // Геркон - Row1
  pinMode(24,INPUT_PULLUP); // Геркон - Row2
  pinMode(26,INPUT_PULLUP); // Геркон - Row3
  pinMode(28,INPUT_PULLUP); // Геркон - Row4
  pinMode(30,INPUT_PULLUP); // Геркон - Row5
  pinMode(32,INPUT_PULLUP); // Геркон - Row6
  pinMode(34,INPUT_PULLUP); // Геркон - Row7
  pinMode(36,INPUT_PULLUP); // Геркон - Row8
  pinMode(2,INPUT_PULLUP);// Кнопка нажатия
  pinMode(38,OUTPUT);
  pinMode(40,OUTPUT);
  pinMode(42,OUTPUT);
  pinMode(44,OUTPUT);
  pinMode(46,OUTPUT);
  pinMode(48,OUTPUT);
  pinMode(50,OUTPUT);
  pinMode(52,OUTPUT);
  pinMode(3,OUTPUT);
  digitalWrite(38,HIGH);
  digitalWrite(40,HIGH);
  digitalWrite(42,HIGH);
  digitalWrite(44,HIGH);
  digitalWrite(46,HIGH);
  digitalWrite(48,HIGH);
  digitalWrite(50,HIGH);
  digitalWrite(52,HIGH);
  digitalWrite(3,LOW);
}

void loop()
{
  //если(digitalRead(10) == 0)
  //{
  Serial.print("--------------------Initial Matrix-----------------------------\n");
  Print(SensorValStore_Prev);
  // doAction();
  delay(40);
  Serial.print("--------------------Final Matrix------------------------------\n");
  Print(SensorValStore_Curr);
  delay(40);
  Difference();
  delay(40);
  binToIntCalc();
  delay(40);
  check();
  delay(40);
  getMovePlayed();
  delay(40);
  getMove();
  delay(40);
  //}
}

void Print(int matrix[8][8])
{
  for(i=0;i<8;i++)
  {
    for(j=0;j<8;j++)
    {
      Serial.print(matrix[i][j]);
      Serial.print(" ");
    }
    Serial.println();
  }
}

void doAction()
{
  nextRow = 0;
  for(i=0;i<8;i++)
  {
    digitalWrite(38 + nextRow,LOW);
    delay(40);
    ReadSensor(i);
    digitalWrite(38 + nextRow,HIGH);
    delay(40);
    nextRow +=2;
  }
}

void ReadSensor(int iter)  
{
  delay(10);
  for(j=0;j<8;j++)
    SensorValStore_Curr[iter][j] = digitalRead(j+2);
  Serial.print("----------------------------------------------");
  Serial.println("Value of sensory board after move is played");
}

void Difference()
{
  for(i=0;i<8;i++)
    for(j=0;j<8;j++)
      temp[i][j] = abs(SensorValStore_Curr[i][j] - SensorValStore_Prev[i[j]);
  Serial.print("-----------------------Difference---------------------------\n");
  Print(temp);
}

void binToIntCalc()
{
  for(i=0;i<8;i++)
    for(j=0;j<8;j++)
    {
      sum1[i] += pow(2,j)*SensorValStore_Prev[i][j];
      sum2[i] += pow(2,j)*SensorValStore_Curr[i][j];
    }
  Serial.print("---------------------sum1 and sum --------------------------\n");
  for(i=0;i<8;i++)
  {
    Serial.print(sum1[i]);
    Serial.print(" ");
  }
  Serial.println();

  for(i=0;i<8;i++)
  {
    Serial.print(sum2[i]);
    Serial.print(" ");
  }
  Serial.println();
}

void check()
{
  k=0;
  l=0;
  for(i=0;i<8;i++)
  {   
    if(sum2[i]>sum1[i])
      k = i;
    if(sum2[i]<sum1[i])
      l = i;
    delay(40);
  }
}

void getMovePlayed()
{
  for(j=0;j<8;j++)
  {
    if(temp[k][j] == 1)
    {
      rank =k+1;
      file = String(char(97+j));
      delay(40);
      moveSan = file + rank;
      Temp = moveSan;
    }
  }
  for(j=0;j<8;j++)
  { 
    if( temp[l][j] == 1)
    {
      rank =l+1;
      file = String(char(97+j));
      delay(40);
      moveSan = file + rank;
      Temp.concat(moveSan);
    }
  }
}

void SendMove(String movePlayed)
{
  Serial.println("start");
  Serial.print(movePlayed);
  Serial.println();
}

void getMove()
{
  while(1)
  {
    if(Serial.available()>0)
    {
      if(Serial.readString() == "Rstart")
      {
        bestMove = Serial.readString(); 
        lcd.setCursor(0,0);
        lcd.print(bestMove);
        delay(5000);
        lcd.clear();  
        Serial.println(bestMove);
        exit(0);
      }
    }
  }
}

КОД PYTHON

import serial
from stockfish import Stockfish
s1 = serial.Serial('/dev/ttyACM0', 9600)
stockfish = Stockfish('/usr/games/stockfish')
while 1 :
    if str(s1.readline(),'UTF-8').strip('\n\r') == 'start' :
                move_played = str(s1.readline(),'UTF-8').strip('\n\r')
                print(move_played)
                // stockfish.set_position(move_played)
                // print("Rstart")
                // print(stockfish.get_best_move().encoded())
                break

, 👍0


1 ответ


-1

Было бы полезно увидеть ваш код, но имейте в виду, что при подключении последовательного монитора к Arduino он сбрасывается, поэтому любой код будет запущен повторно

,