{"id":120,"date":"2022-04-25T10:25:46","date_gmt":"2022-04-25T08:25:46","guid":{"rendered":"https:\/\/ics.science.upjs.sk\/iot\/?page_id=120"},"modified":"2023-02-15T13:31:31","modified_gmt":"2023-02-15T12:31:31","slug":"seriova-komunikacia-experimenty-2022","status":"publish","type":"page","link":"https:\/\/ics.science.upjs.sk\/iot\/cvicenia-2022\/seriova-komunikacia-experimenty-2022\/","title":{"rendered":"S\u00e9riov\u00e1 komunik\u00e1cia &#8211; experimenty"},"content":{"rendered":"<h3>Arduino &#8211; analog read + serial<\/h3>\n<pre>int analogPin = 3;\r\n\r\nvoid setup() {\r\n   Serial.begin(9600);\r\n}\r\n\r\nvoid loop() {\r\n   int val = analogRead(analogPin);\r\n   Serial.println(val);\r\n   delay(100);\r\n}\r\n<\/pre>\n<p><a href=\"https:\/\/ics.science.upjs.sk\/iot\/wp-content\/uploads\/sites\/18\/2022\/04\/photoAnalog.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-121\" src=\"https:\/\/ics.science.upjs.sk\/iot\/wp-content\/uploads\/sites\/18\/2022\/04\/photoAnalog-1024x367.png\" alt=\"\" width=\"900\" height=\"323\" srcset=\"https:\/\/ics.science.upjs.sk\/iot\/wp-content\/uploads\/sites\/18\/2022\/04\/photoAnalog-1024x367.png 1024w, https:\/\/ics.science.upjs.sk\/iot\/wp-content\/uploads\/sites\/18\/2022\/04\/photoAnalog-300x108.png 300w, https:\/\/ics.science.upjs.sk\/iot\/wp-content\/uploads\/sites\/18\/2022\/04\/photoAnalog-768x275.png 768w, https:\/\/ics.science.upjs.sk\/iot\/wp-content\/uploads\/sites\/18\/2022\/04\/photoAnalog-1536x551.png 1536w, https:\/\/ics.science.upjs.sk\/iot\/wp-content\/uploads\/sites\/18\/2022\/04\/photoAnalog.png 1773w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<hr \/>\n<h3>Arduino k\u00f3d<\/h3>\n<pre>#define MAX_LINE_LEN 50\r\n\r\nchar lineBuffer[MAX_LINE_LEN];\r\nint lineLen = 0;\r\n\r\nvoid setup() {\r\n  Serial.begin(9600);\r\n}\r\n\r\nvoid loop() {\r\n  while (Serial.available() &gt; 0) {\r\n    char c = Serial.read();   \r\n    lineBuffer[lineLen] = c;\r\n    lineLen++;\r\n    if ((c == '\\n') || (lineLen == MAX_LINE_LEN)) {\r\n      Serial.write(lineBuffer, lineLen);\r\n      lineLen = 0;\r\n    }\r\n  }\r\n}\r\n<\/pre>\n<h3>Java k\u00f3d<\/h3>\n<pre>package sk.upjs.iot.serial;\r\n\r\nimport java.util.*;\r\n\r\nimport jssc.SerialPort;\r\nimport jssc.SerialPortException;\r\n\r\npublic class SerialLineIO {\r\n\r\n  \/**\r\n   * Zapuzdreny seriovy port.\r\n   *\/\r\n  private final SerialPort port;\r\n\r\n  \/**\r\n   * Vlakno realizujuce citanie.\r\n   *\/\r\n  private final Thread thread;\r\n\r\n  \/**\r\n   * Priznak poziadavky na ukoncenie.\r\n   *\/\r\n  private volatile boolean stopFlag;\r\n\r\n  \/**\r\n   * Riadky na odoslanie.\r\n   *\/\r\n  private Queue linesToSend = new LinkedList&lt;&gt;();\r\n\r\n  \/**\r\n   * Synchronizacny zamok.\r\n   *\/\r\n  private final Object lock = new Object();\r\n\r\n  public SerialLineIO(SerialPort port) {\r\n    this.port = port;\r\n    thread = new Thread(this::loop);\r\n  }\r\n\r\n  \/**\r\n   * Nastartuje IO.\r\n   *\/\r\n  public void start() {\r\n    thread.start();\r\n  }\r\n\r\n  \/**\r\n   * Zastavi IO.\r\n   *\/\r\n  public void stop() {\r\n    stopFlag = true;\r\n    synchronized (lock) {\r\n      lock.notifyAll();\r\n    }\r\n  }\r\n\r\n  private void loop() {\r\n    StringBuilder lineBuilder = new StringBuilder();\r\n    try {\r\n      while (!stopFlag) {\r\n        \/\/ ak mame riadky na odoslanie, tak ich posleme\r\n        String lineToSend = null;\r\n        synchronized (linesToSend) {\r\n          lineToSend = linesToSend.poll();\r\n        }\r\n        if (lineToSend != null) {\r\n          port.writeString(lineToSend);\r\n          continue;\r\n        }\r\n\r\n        \/\/ skusime precitat prijate data\r\n        int[] receivedData = port.readIntArray();\r\n\r\n        if (receivedData != null) {\r\n          \/\/ ak mame nejake prijate data, tak ich spracujeme a hladame konce riadkov\r\n          for (int b : receivedData) {\r\n            if (b == '\\n') {\r\n              handleLine(lineBuilder.toString());\r\n              lineBuilder.setLength(0);\r\n            } else {\r\n              lineBuilder.append((char) b);\r\n            }\r\n          }\r\n        } else {\r\n          \/\/ ak nemame data, tak uspime vlakno, aby sme umiernili cinne cakanie\r\n          synchronized (lock) {\r\n            try {\r\n              lock.wait(100);\r\n            } catch (InterruptedException ignore) {\r\n              \/\/ nic na pracu\r\n            }\r\n          }\r\n        }\r\n      }\r\n    } catch (Exception e) {\r\n      e.printStackTrace();\r\n    } finally {\r\n      try {\r\n        port.closePort();\r\n      } catch (SerialPortException ignore) {\r\n\r\n      }\r\n    }\r\n  }\r\n\r\n  \/**\r\n   * Odosle riadok na seriovy port.\r\n   * \r\n   * @param line\r\n   *            riadok\r\n   *\/\r\n  public void sendLine(String line) {\r\n    if (!line.endsWith(\"\\n\")) {\r\n      line = line + \"\\n\";\r\n    }\r\n\r\n    synchronized (linesToSend) {\r\n      linesToSend.add(line);\r\n    }\r\n\r\n    \/\/ prerusime cakanie hlavneho vlakna\r\n    synchronized (lock) {\r\n      lock.notifyAll();\r\n    }\r\n  }\r\n\r\n  \/**\r\n   * Spracuje prijaty riadok.\r\n   * \r\n   * @param line\r\n   *            prijaty riadok (bez znaku konca riadka).\r\n   *\/\r\n  private void handleLine(String line) {\r\n    System.out.println(line);\r\n  }\r\n}\r\n\r\n<\/pre>\n<pre>package sk.upjs.iot.serial;\r\n\r\nimport java.util.Scanner;\r\n\r\nimport jssc.SerialPort;\r\nimport jssc.SerialPortException;\r\n\r\npublic class App {\r\n  public static void main(String[] args) {\r\n    \/\/ Otvorime a pripravime seriovy port.\r\n    SerialPort serialPort = new SerialPort(\"COM5\");\r\n    try {\r\n      serialPort.openPort();\r\n      serialPort.setParams(SerialPort.BAUDRATE_9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1,\r\n          SerialPort.PARITY_NONE);\r\n    } catch (SerialPortException ex) {\r\n      System.out.println(\"Zlyhalo otvorenie serioveho portu: \" + ex);\r\n    }\r\n\r\n    \/\/ Vytvorime a nastartujeme jednoduchy thread-safe wrapper pre seriovy port\r\n    SerialLineIO lineIO = new SerialLineIO(serialPort);\r\n    lineIO.start();\r\n\r\n    \/\/ Citame vstup po riadkoch\r\n    try (Scanner s = new Scanner(System.in)) {\r\n      while (s.hasNextLine()) {\r\n        lineIO.sendLine(s.nextLine());\r\n      }\r\n    }\r\n  }\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Arduino &#8211; analog read + serial int analogPin = 3; void setup() { Serial.begin(9600); } void loop() { int val = analogRead(analogPin); Serial.println(val); delay(100); } Arduino k\u00f3d #define MAX_LINE_LEN 50&hellip;<\/p>\n","protected":false},"author":22,"featured_media":0,"parent":38,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-120","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ics.science.upjs.sk\/iot\/wp-json\/wp\/v2\/pages\/120","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ics.science.upjs.sk\/iot\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ics.science.upjs.sk\/iot\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ics.science.upjs.sk\/iot\/wp-json\/wp\/v2\/users\/22"}],"replies":[{"embeddable":true,"href":"https:\/\/ics.science.upjs.sk\/iot\/wp-json\/wp\/v2\/comments?post=120"}],"version-history":[{"count":3,"href":"https:\/\/ics.science.upjs.sk\/iot\/wp-json\/wp\/v2\/pages\/120\/revisions"}],"predecessor-version":[{"id":125,"href":"https:\/\/ics.science.upjs.sk\/iot\/wp-json\/wp\/v2\/pages\/120\/revisions\/125"}],"up":[{"embeddable":true,"href":"https:\/\/ics.science.upjs.sk\/iot\/wp-json\/wp\/v2\/pages\/38"}],"wp:attachment":[{"href":"https:\/\/ics.science.upjs.sk\/iot\/wp-json\/wp\/v2\/media?parent=120"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}