Запрос, связанный с последовательной связью
У меня есть 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
@Roshan, 👍0
1 ответ
Было бы полезно увидеть ваш код, но имейте в виду, что при подключении последовательного монитора к Arduino он сбрасывается, поэтому любой код будет запущен повторно
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды