Soros hívás és válasz (kézfogás) ASCII-kódolású kimenettel

Több változó küldése hívás és válasz (kézfogás) módszerrel, és küldés előtt ASCII-kódolja az értékeket.


Utolsó felülvizsgálat: 2022.02.04 16:50


Ez a példa a karakterlánc-alapú kommunikációt mutatja be az Arduino kártyáról a számítógépre hívás és válasz (kézfogás) módszerrel.

A vázlat indításkor ASCII-karakterláncot küld, és ezt addig ismétli, amíg soros választ nem kap a számítógéptől. Ezután három szenzorértéket küld ASCII-kódolású számként, vesszővel elválasztva, és soremelés és kocsivisszaadás zárja le, és újabb választ vár a számítógéptől.

Használhatja az Arduino Software (IDE) soros monitort az elküldött adatok megtekintéséhez, vagy kiolvasható a Processing (lásd a kódot lent), a Flash, PD, Max/MSP (lásd lenti példa) stb. segítségével. Az alábbi példák felosztják a bejövő karakterláncot a vesszőknél, és a karakterláncot újra számokká alakítják.

Hasonlítsa össze ezt a soros hívás és válasz példával. Annyiban hasonlóak, hogy mindkettő kézfogásos módszert használ, de ez az érzékelő leolvasásait karakterláncként kódolja, míg a másik bináris értékként küldi el. Míg az ASCII-kódolású karakterláncok küldése több bájtot vesz igénybe, ez azt jelenti, hogy könnyedén küldhet 255-nél nagyobb értékeket minden egyes szenzorolvasáskor. Soros terminál programban is könnyebben olvasható.

Hardver szükséglet

  • Arduino kártya

  • 2 analóg érzékelő (potenciométer, fotocella, FSR stb.)

  • nyomógomb

  • 3 10 kohm-os ellenállás

  • összekötő vezetékek

  • dugdosós próbapanel (breadboard)

Szoftver szükséglet

Az áramkör

Csatlakoztassa az analóg érzékelőket a 0 és 1 analóg bemeneti kivezetésekhez 10 kohmos ellenállásokkal, amelyeket feszültségosztóként használnak. Csatlakoztasson egy nyomógombot vagy kapcsolót a 2. digitális I/O kivezetéshez egy 10 kohmos ellenállással a földre való hivatkozásként.

Vázlat

A kód

/*
  Serial Call and Response in ASCII
  Nyelv: Wiring/Arduino

  Ez a program indításkor ASCII A-t (65 bájt) küld, és addig ismétli, amíg be nem
  érkezik néhány adat. Ezután megvár egy bájtot a soros porton, és három ASCII-kódolt,
  vesszővel elválasztott érzékelőértéket küld, amelyeket soremelés és kocsivissza zár le,
  valahányszor egy bájtot kap.

  Az áramkör:
  - a 0 és 1 analóg bemenetekhez csatlakoztatott potenciométerek
  - nyomógomb a digitális I/O 2-höz

  created 26 Sep 2005
  by Tom Igoe
  modified 24 Apr 2012
  by Tom Igoe and Scott Fitzgerald
  Thanks to Greg Shakar and Scott Fitzgerald for the improvements

  Ez a kód nyilvános.

  https://docs.arduino.cc/built-in-examples/communication/SerialCallResponseASCII
*/

int firstSensor = 0;    // az első analóg érzékelő
int secondSensor = 0;   // a második analóg érzékelő
int thirdSensor = 0;    // digitális érzékelő
int inByte = 0;         // a bejövő soros byte

void setup() {
  // soros port indítása 9600 bps-el:
  Serial.begin(9600);
  while (!Serial) {
    ; // várja meg a soros port csatlakozását. Csak a natív USB-porthoz szükséges
  }


  pinMode(2, INPUT);   // a digitális érzékelő a 2-es digitális kivezetésen van
  establishContact();  // küldjön egy bájtot a kapcsolatfelvételhez, amíg a vevő nem válaszol
}

void loop() {
  // ha érvényes bájtot kapunk, olvassuk el az analóg bemeneteket:
  if (Serial.available() > 0) {
    // bejövő bájt beszerzése:
    inByte = Serial.read();
    // az első analóg input olvasása:
    firstSensor = analogRead(A0);
    // a második analóg input olvasása:
    secondSensor = analogRead(A1);
    // kapcsoló olvasása, leképezheti 0-ra vagy 255-re
    thirdSensor = map(digitalRead(2), 0, 1, 0, 255);
    // az érzékelő értékek küldése:
    Serial.print(firstSensor);
    Serial.print(",");
    Serial.print(secondSensor);
    Serial.print(",");
    Serial.println(thirdSensor);
  }
}

void establishContact() {
  while (Serial.available() <= 0) {
    Serial.println("0,0,0");   // kezdeti karakterlánc küldése
    delay(300);
  }
}

/* Processing vázlat a példával való futtatáshoz:

  // Ez a kód nyilvános.

  import processing.serial.*;     // importálja a Processing soros könyvtárat
  Serial myPort;                  // A soros port

  float bgcolor;      // Háttér szín
  float fgcolor;      // Kitöltőszín
  float xpos, ypos;         // A labda kiinduló helyzete

  void setup() {
    size(640, 480);

    // Listázza az összes elérhető soros portot
    // ha a Processing 2.1 vagy újabb verzióját használja, használja a Serial.printArray()-t
    println(Serial.list());

    // Tudom, hogy a Mac gépen a soros lista első portja mindig az FTDI
    // adapterem, ezért a Serial.list()[0]-al nyitom meg.
    // Windows rendszerű gépeken ez általában a COM1-et nyitja meg.
    // Nyissa meg azt a portot, amelyet éppen használ.
    myPort = new Serial(this, Serial.list()[0], 9600);

    // bájtokat olvassa be a pufferbe, amíg soremelést nem kap (ASCII 10):
    myPort.bufferUntil('\n');

    // rajzoljon sima élekkel:
    smooth();
  }

  void draw() {
    background(bgcolor);
    fill(fgcolor);
    // Rajzolja meg az alakzatot
    ellipse(xpos, ypos, 20, 20);
  }

  // A serialEvent metódust a Processing kisalkalmazás automatikusan lefutja,
  // amikor a puffer eléri a setup() bufferUntil() metódusában beállított bájtértéket:

  void serialEvent(Serial myPort) {
    // olvassa a soros puffert:
    String myString = myPort.readStringUntil('\n');
    // ha a soremelésen kívül bármilyen bájtja van:
    myString = trim(myString);

    // osszuk fel a vesszőnél a karakterláncot, és alakítsuk át a szakaszokat egész számokká:
    int sensors[] = int(split(myString, ','));

    // nyomtassa ki a kapott értékeket:
    for (int sensorNum = 0; sensorNum < sensors.length; sensorNum++) {
      print("Sensor " + sensorNum + ": " + sensors[sensorNum] + "\t");
    }
    // adjon hozzá egy soremelést, miután az összes érzékelőértéket kinyomtatta:
    println();
    if (sensors.length > 1) {
      xpos = map(sensors[0], 0, 1023, 0, width);
      ypos = map(sensors[1], 0, 1023, 0, height);
      fgcolor = sensors[2];
    }
    // küldjön egy bájtot további adatok kéréséhez:
    myPort.write("A");
  }

*/

/* Max/MSP version 5 patch a példával való futtatáshoz:

  ----------begin_max5_patcher----------
  3640.3oc6cs0jZajE94Y9UzKkeHoVloTeSHkm1II0VkeHIthSs6C1obIjZ.E
  KjHRhY7jT4+9d5KBj.jTCAXfoV6x.sj5VmyWet127ed6MCFm8EQw.z2f9.5l
  a9yau4F0kjW3FS4aFLO3KgIAEpGaPX174hzxAC02qT7kR80mkkUHPAnBQdbP
  BZQVdIZRd1bT4r3BDTmkU0YQPY3r3zoeJWDVpe2ttr6cFhvXt7KhyH8W26f9
  USkhiTulrw+1czQUszjrzxzf4B0sdP9dqtS5x4woIhREQiWewrkkUW0oViTD
  +GpFASt2Qd0+51akeLzRPIU7DPXagIFnH.4653f9WAKKyxVHRQNcfDXlih2w
  puvbdWHAlcTPBRKHg4x5mr74EBMINHV1+iFL.8qG.VMWTTDLUrs.TBH+zAvP
  nTEhvvxun9pBd6FWH38DWH6DWv6ItbX.RKBOJ7XbP5ztvDesvhBLb6VTwcOg
  DmiBjnXfiIrjjED0CpP490PEmtPExwQA5EGUVjK.CKQJqtcYl0nCMRAJi76D
  Z7dQflCCVV1i+ENiTy3AwYaghEA4.KVJx+jHMXbhntJPceO3iBpPOPKtZqtU
  jUoXtw28fkEimmEIlOI.3Q4iMT9wO+iLxc9O7sN28928t6Ve8uMYo.7EUN6t
  ePVoUW+6E4hOW7CAgeaV1meWd1cuWnYLy8mKhhClGDd25F3ce+C2si1Ud42+
  bZ3IQJOXg7q96t80e50YvDjqHw7VvkRTXhHHuKEerRwmqfBFsS.g9h.HZN3X
  hJf5Qd+xHZHgzc.mrqeYjbn4E84evfIDUjDtjNwD2iRHV6anmGdbmsfKxTTJ
  dd93rjtBJ2U42foCwZDqKfYzKkrh4VgYIY4FxVRmN2646f8ck+xw7KrjzOlZ
  ZYAVfdZgKlaWn29FzA8nfdR2quj.3ejflBJnKr.Dwpf13cZBm85P0rPj.rOB
  6fvztPFGkVI0SAPi5NKHmih7E8Ph2e35uOtYN6x6JEQtJVWpV7gRtm2dZy9W
  +YMCxLHrEvAknQktDVdY7v82SFosgmSGHO56BRRt6mEEKxRKDnGd+2812h9X
  5GSeODOcAJ.M9YHHAfjPkyD0GIugn.Ht6bQ.7TTS8DoPtCQCQxWobX+jYPUJ
  hPn3zgnx7kogphieFZ2j3TwDgH5dzaUscJ77kEnIY4hoYKglVYzcH5KKxJzu
  qmgegxl.0MLNGBNDsr.5IUz0iAPZFE.0TtLOEdClQYrAAeORwW+XVo3aP+hb
  DHUBCH.mfbEKfGOPyjQhGiCAdNUUBRcQjij4X.u5MZRDzHSyTDQFbcYdHHIM
  AzlF1lnoLjKG8UZH5guV1vEkA4kKWbOPGPC9YgjNdJHVy+ZJQ1.Cq.FUWQpA
  ke.8DbUwi.YEWBUCDhPyAXCEETFbuhICg9EIRiYnGVjKyt0+io.r+9vrxRz+
  Nt7OlJxCRhT35u.X0amlI9X5xEQppQwneJrLarPVU7JkGYWVHz2njevz1UoX
  XkoEWOkxDWO9kXYocoTwuzF611zXJyimB3F5qf9nOT9qesryJTJ1EOcV4cIh
  IPVWYoOBUMFTl.4sGRRzRT4AOIkRjn8h7LnNJI2mhg6OSk5JZrPJ4i9gfu.R
  w+NHLCcpfAMij88n+qTPPMt4UTwj3bAnY.h.aIe.RiAEeF8Pdzx3zLkLUs1Z
  mcmczah0FH4ZmpLcp.rVbX3d0zalKhSiKAxBZ9BU2zTP3uPobgL1Q.U0.kl+
  jcBZj1AMOpzsJYjdz0n53QXsfYrqELKblH7yUFoDfPVXbrwDGXqCjwjviT7a
  rXZbpxOvxzXvpOnPH0GlTJMZog8l2UZJcdPjxjG7ywIYgeFULaInFDk8jpxZ
  apvMA4cv9X.7.vaRRGFAcPYHMR0dF2BZC7wEJ2TOKeZnCRD+HzJo.OLWSW6r
  qk2wfI6pGf.pdjC4rpfL2YeK8JYloVf93.ocJEvocv9wAcEiMQgBtl.lb0y9
  heKnvtGRs+iHOJHM3uaZbN1jDrhED4FfwfLPCEmH8jV.BB0Z+aF.Vkqc4apU
  EIb9a5zAcGt5Rf3WdsNJ3R4PXDU0mouHzIca0MWO.KpQjT8oq1SIyqV3mP24
  ToxfHpdyOPNqgwoK.W.fxfRNtwsiDSBVlT9ociSMu+jfPQqUtk9paFLMONJK
  URFMpq7xUuvOXF1HBuN6ndhzfE6nxPXQkKKFGjKQNyHtSptYYVVRyaspyBD3
  CRiA0YQYrlbgHdptY77E4wZk5UWSOf9yJByyRRZzT5673NtiNrvmhiJmoZq5
  fI73wKp5DFrBihhmBNxadsxfoEMuRiIbutfVcM4FWuyr.2bvrlNF5.3U+q9C
  sKaa5jkMt70iSd8bC2ZbEFUuAa0DWqYF0tJ91p43649br2nZ2usLGuoxrnQq
  6TArNx+1CjRLPpVWf62Kj59ZFRa38Y6D0kRo8AnT8b0g0e4p8+f6.P4sBnaX
  TqMmPsOdOcjG+dMtOmdzcgLdIGqjX0J+FAVrmSu.L8fAX19Ky1C.e1.z+IB2
  qpeCIUV+.I4fARxQGH0i.9ECVZrhZMTheMCkc4XRMsoCgbef2ZFjaF5MXzaH
  n2PQugYmhe0WjdcU47Z1Ukhb6CwFISy2HNtcvtaNRWdshHNVgHcNMUlopRm4
  tJByyLXfI0UN6GM7eUiFTm8BMbctZQC8atOegDu6oveXrgpeaGnfaETvsBJN
  6AKuNsT4n+zRVXJtQd+ciEEYKyCq.8ptRTSdBRQrLNcUd5eXcjoa7fyhihZl
  UrNQxBYZo5g.vpdt8klkJi1QyPvdH7UFMStbvYu8Amu1nY7ECMKGXBqnY2KH
  Z18Jjl4aYNnEYiQWVzrUxytWNzL0VZ14xglI6isN5kAMi2GZlbYPyNma6FqC
  aJRs9qEogO+ovfvYFxxjGV07cLnH3QQzm.R.BG7SAkk4wiWVpC2p9jwX23ka
  0zSz4M6e1QZY.8mljMNHwLURqZ9FuzslMk8ZJXtcMPeblVut1XYDhdMCpmjZ
  8BAqsU9DezKxJAa8Hmbbfi+wccuVv7c0qELrEHB+UAhHWzCfCbKPEyBki24Z
  clythVwfkYSmlHrPdX8tC5v1iPb5ArPuOWc8NVrRZspq24UxhE0wBcAsMyt2
  2LLuqvkKZRXjEq5CM6S3tq9Zm6HD+8Prm0F+jDWn1paUe+2ZuF259kxkiR5W
  Qf6vzKBtMm+gFrMeuWsKW.6B61VyWOFjz0Zsmwza+.ikxQcAL3iDtbLWMTKm
  OtyMEFcjWM9iu0rMa81D8kUl3v2ewcHWP5B2HX6kK7t7DL5fs6JVIrO0Z1l3
  bEpOP3zih9.gbspPzKDYbRVAQ7CFhtZsYzhW1ko0WEJcG3oAC0aRIyxKsUEI
  +iDPwOLfp0uNA68MmtSUSmRuNb8d1ttWya7sVWf5Iwf.1LQtZUnqNvT1bS6z
  E5o2vfqNSH5bufQbuZV09M.E04Mj8XBUiBqNGl5FSt3NGlZaGRpV6wc4kiWi
  q0twaaORhul1jjsIi7cMjQlJJUaQuhR495nlfRQWRJXkrgmMGXWjKM4jdGJH
  yovkl4HUetutzWuY5tjFHneGn77rtG3iJ92whCVJxKhBwgGtRaFIzabfNrRn
  WThd9q24vsZjf9JvHwOKBhprFDmtXYIZ7xISjaO1GE4OK2V9yiS.qFhvrznh
  8cKyMZs7EVepT01FlCe0rIC0lUk6NX4N9syCyAE660+ovE9hyGqjaGurrLak
  G0YwoMlFO4YMSZjd9DcWucsjUr1Yqgy8TluCY3N9Q8.+k0JCD3ZTS0CW8Qyb
  s19nOxrgjw7VFU+3ooYviK66pCfimt8AAxHOOBkK+EajC2yayWtciMzgdvpM
  NKORj29YyGcS4wFVlql0wcZTg1yw5wvMNiTpuUzpu.Y0miRlgO0w7wpZI2Em
  SUBGayVM5eqU4C+rV4ZSPkvXqLJbAHlR3mKwT5ISL8+Kv0k.GWEKwpP3ewk3
  7omKIN7EtDmp4ZtHk0BfatXgLhgasHgZrVYaY8AIO7fq8Pas1fFzjd4ibwpd
  XO4GXOeOG+lcyasNh1R+wVx2yBxeTOT+wiZFYA0P48PNyiiVjAhJlNT4Qvpb
  uj3aN2qYqJcBfSWhMbf+YCPcsfbNeTC2l9WNc+5eIlkST0RJgupzIn+kysgC
  X6GGXnYpdYfP0GP6MKQXM3N1Ih6XVvcLuym7B0B5w8v.ahqBI49qJcJ.TaX.
  N+xBP4NGHhhqYfkRNM9q1f3ZweqyYCQYdGCSZGQ5wBx47o.Ssw+CkcgQOmud
  KZic4QKzCw+7ROm8nY2LfMsEDtdfeMKSn5Ev95IQhorcqJcBrzPsQUhRNe8M
  1X6lhOezC4Bidv1nKcFs8YimJ9n8RWZXiO7aSCxDRLdjd91qU5TnmXCeRvmR
  9jnm7b15RmJ9rO4Kr+IgO04BfczyOpqx9npzofOsIlaR8Mo0IUMR48i0mYly
  lVMwlw6gbloGRezy4yKEw6BHBBWik.eRi3DNM5KDahS.SOE1EjmXl7Uyqo9T
  AtQAO8fG3oLX3cZFxKh0FLNSRfDaoG74gdvW.ZDU9FMGSdFMBt+IQh.6eIvw
  FujTkJREGKKcJ3X2WtXf7Ub1HywEqxh2tJnE.FcZhMByrcXQw1x+bOWJYjpy
  lv8oq55aEHLcwD8hJjxbVU5EigcNtL7Ql76KVVp69Huhcb87vpoCkRYT+96v
  Hd5Ay1rofMqm+FkLYvv0+GL3FkL6bLp21kL6QFNV8BNM48foWBV4zt1wXm5V
  4jkNEbL45dtNw13Iltmi9sAyY0S0l8BR+3yWjVXax7eOmKrp4m0QKIal6VYo
  SAf5XQxSrCa5l0qk45k5kAzqEgMNgzkz9FmL5abpnu4IhNzZ+0s+OKCSg0.
  -----------end_max5_patcher-----------

*/

A Processing kód

Másolja ki a Processing vázlatot a fenti kódmintából. Ahogy megváltoztatja az analóg érzékelő értékét, egy ehhez hasonló golyót fog látni a képernyőn. A labda csak akkor jelenik meg, ha megnyomja a gombot:

A Max kód

A max patch így néz ki. A patch szövege a fenti kódban található. Másolja ki és illessze be egy "New patcher" ablakba a vázlat megtekintéséhez.

Tudj meg többet

További alapvető oktatóanyagokat a beépített példák részben talál.

Felfedezheti a nyelvi referenciát is, az Arduino programozási nyelv részletes gyűjteményét.