Arduino  - シリアルポート読み書き

**抽象**
![pic face.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447311/4b8bcfd7-60c0-4e52-7a60-e194ef65f9b8.jpeg)

ユニバーサル非同期受信機／送信機（ＵＡＲＴ）は、組み込みシステム設計用の主要通信サブシステムである。 非同期送信では、送信側が受信側にクロック信号を送信しなくてもデータを送信できます。 代わりに、送信側と受信側は事前にタイミングパラメータについて合意しなければならず、送信側ユニットと受信側ユニットを同期させるために使用される各ワードに特殊なビットが追加されます。 LCDディスプレイ[16×2 LCD]は、受信したUARTバイトを表示するために使用されます。 この扱いにくいのは、Arduinoマイクロコントローラを使ってUARTを介してデータを送受信することです。
**部品とコンポーネント**
Arduino Unoボード
16×2 LCD
1Kオームポテンショメータ

**ステップ1：回路図**
![prot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447311/d3964911-c1d2-020f-5094-c4c20d3c132d.jpeg)
![shema.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447311/c0bfbacf-21cb-2c88-7e16-c974e361eb62.jpeg)
16×2は、2つのディスプレイ行を含む一般的に使用されているLCD構成です。 2行にはそれぞれ最大16個の5×7または5×8ドットマトリックス文字を表示できます。
この例では、見やすさのためにコントラスト調整とバックライトを備えた16ピンLCDを使用しています。ドットマトリックス文字を5 x 8の解像度で表示します。
ArduinoのA0、A1、A2、A3、A4、およびA5アナログIOピンをLCDディスプレイユニットに接続します。 Arduinoのピンは、LCDの4ビットデータモードと互換性のあるデジタル入出力信号を処理するように設定する必要があります。
ディスプレイの視認性に問題がある場合は、コントラストを調整してください。それで解決するはずです。
マイクロプロセッサのハードウェアシリアルポートは、9600、8N1モード/ボーレートとして設定する必要があります。
それから、Proteus COMport物理インターフェースモジュール（COMPIM）をArduinoのシリアルポートに接続します。 COMPIMは、9600、8N1モード/ボーレートで同様に設定されています。
次に [Virtual Serial Port Driver](https://www.virtual-serial-port.org/)（VSPD）を使って仮想シリアルポートを作成します。
この設定により、COMPIMから新しく作成された仮想ポートを介してシリアルデータを送信できます。データはコンピュータのシリアル端末で監視できます。
COMPIMシリアルデータはVSPD仮想シリアルポートに渡され、PCのシリアル端末（この場合はLCD）で監視されます。

**ステップ2：ソフトウェア**
LCDデバイスはArduino LiquidCrystalライブラリを利用しています。このディスプレイはシリアル端末として機能し、送信されたシリアルポートデータを見ることができます。
テスト文字列は、シリアルポートを介して500msごとに送信されるように設定されています。それらは受信され、シリアルポートモニタリングツールとして機能するLCDに表示されます。
{コード}
 /*
 Demonstrates the use of a serial port.
 Serial received bytes are displayed on 16x2 LCD screen.
 
 The Arduino circuit connection for LCD:
 * LCD RS pin to analog pin A0
 * LCD Enable pin to analog pin A1
 * LCD D4 pin to analog pin A2
 * LCD D5 pin to analog pin A3
 * LCD D6 pin to analog pin A4
 * LCD D7 pin to analog pin A5
 * 
 */

// include the library code:
.#include < LiquidCrystal.h>

//Initialize the library with the numbers of the interface pins
LiquidCrystal lcd(A0,A1,A2,A3,A4,A5);

// a string to hold incoming data
String inputString = "";

// whether the string is complete         
boolean stringComplete = false; 

void setup() 
{
  //Initialize serial port
  Serial.begin(9600);
  
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  
  // Print a message to the LCD.
  lcd.print("Serial TEST");

  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
  
}

void loop() 
{
  Serial.write("This a test \n");

 // print the string when a newline arrives:
  if (stringComplete) 
  {
   //lcd clear
   lcd.clear();
    lcd.print(inputString);
    // clear the string:
    inputString = "";
    stringComplete = false;
  }
  
  //500smS Delay
  delay(500);
}
/*
  SerialEvent occurs whenever a new data comes in the
 hardware serial RX.  This routine is run between each
 time loop() runs.  500mS delay inside loop can delay
 response.  Multiple bytes of data may be available.
 */
void serialEvent() 
{
  while (Serial.available()) 
  {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

**ステップ3：結論**
![coden.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447311/39a126d8-60ca-b3f4-31fa-979e31949020.jpeg)

私達はProteusとシリアルモニターをうまく実装しました。このシリアルポートは、さまざまな埋め込みプロジェクトの通信インターフェイスとして使用できます。