HardwareSerial
このページでは、組み込みのシリアルポート(USARTとも呼ばれます)を使用する方法について説明します。 シリアルポートの詳細については、USARTを参照してください。 入門
まず、使用するシリアルポートを決め、通信するデバイスにそのピンを接続します。 シリアルポートのTXピンとRXピンは、ボードのシルクスクリーンにラベルが付けられています(たとえば、シリアルポート2には「TX2」と「RX2」というラベルが付いています)。
シリアルポートを制御するための変数は、シリアル(Serial)とシリアルポートの番号です。 たとえば、シリアルポート1を変数Serial1、シリアルポート2をSerial2などで制御できます。
シリアルポートの使用を開始するには、まずシリアルポートをオンにする必要があります。 シリアルポートのbegin()関数を呼び出して、通信するボーレートを与えてください。 使用するボーレートがわからない場合、9,600は試しても安全な(遅いですが)値です。 次の例のように、setup()のbegin()にこの呼び出しを行います。
code:sample1.ino
void setup() {
// 9600 is the baud rate to use. The baud rate determines how
// fast the communication goes.
Serial1.begin(9600);
}
void loop() {
// Communicate using Serial2 here
}
シリアル通信
シリアルポートが設定されたので、通信を開始します。
シリアルポートの一般的な用途の1つは、文字列やその他のデバッグ情報をコンピュータに出力することです。 print()とprintln()を使って次のように数字や文字列を印刷することができます:
code:sample2.ino
void printSomeInformation() {
Serial2.print("First, print this string. Then print a number: ");
Serial2.print(42);
Serial2.print(". You can print floating point values, too: ");
Serial2.print(3.14);
Serial2.println(". Using println() instead of print() ends the line.");
Serial2.println("This sentence starts on a new line.");
}
この種の通信は、双方向に進むことができます。コンピュータからシリアルポートに文字を送信することもできます。 availabl()関数を使っていくつの文字が読み込みを待っているのかを確認し、read()を使って一度に1つずつ読み出すことができます。 次のサンプルプログラムは、これらの関数を使用して、Serial1に送信されたものを「エコーバック」します。
code:sample3.ino
void setup() {
Serial2.begin(9600);
}
void echoCharacter() {
// Check to see if we have received any information. numUnread
// will hold the number of bytes we've received, but haven't
// looked at yet.
int numUnread = Serial2.available();
// numUnread > 0 means that there are some unread bytes waiting
if (numUnread > 0) {
// Read a single byte out:
byte b = Serial2.read();
// And then print it back:
Serial2.print(b);
}
}
void loop() {
echoCharacter();
}
関数リファレンス
このセクションでは、シリアルポートで使用できる機能の完全な一覧を示します。
シリアルポートクラス。 事前定義されたインスタンスは、Serial1、Serial2、およびSerial3です。
コンストラクタ
■HardwareSerial(struct usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin)
インスタンスの生成と初期化を行います。
引数
usart_device :USARTデバイスの構造体変数のアドレス
tx_pin :送信ピン番号
rx_pin :受信ピン番号
UART1~UART5が指定可能です。
code:usart.h
・・・・
extern struct usart_dev *USART1;
extern struct usart_dev *USART2;
extern struct usart_dev *USART3;
extern struct usart_dev *UART4;
extern struct usart_dev *UART5;
tx_pin、tx_pinには次のピンの指定が可能です。
code:boardserial
Maple(Arduino STM32)では、事前定義されたインスタンスSerial1、Serial2、およびSerial3が用意されており、コンストラクタを利用することはありません。
■ void begin(unsigned long baud)
■ void begin(unsigned long baud, uint8_t config)
通信用にHardwareSerialオブジェクトを設定します。 このメソッドは、HardwareSerialオブジェクトを使用する前に呼び出す必要があります(通常、これはsetup()関数で呼び出します)。
引数
baud :通信速度(単位はbps)
config :通信条件(データ長、パリティ、ストップビットの組み合わせ)
通信速度は一般的に利用されている速度以外の整数も可能です。
ハードウェアの仕様ではSerial1は4.5Mbps、それ以外は2.25Mbpsまでサポートします。
(補足:Blue PillボードのSerial1にて921,600bpsの通信ができることを確認しました)
通信条件には次の定数が用意されています。
table:通信条件
定数 テータ長 パリティ ストップビット 備考
SERIAL_8N1 8 なし 1 デフォルト
SERIAL_8N2 8 なし 2
SERIAL_9N1 9 なし 1
SERIAL_9N2 9 なし 2
SERIAL_8E1 8 even 1
SERIAL_8E2 8 even 2
SERIAL_8O1 8 odd 1
SERIAL_8O2 8 odd 2
指定しな場合は、SERIAL_8N1となります。
Mapleボード(Arduino STM32)ではArduino(AVRマイコン)の設定値のうちのいくつかは未サポートです。
戻り値
なし
通信の終了
■ void end()
このオブジェクトに関連付けられたUSARTを無効にし、関連する通信ピンを他の目的に使用できるようにします。
通信状態のチェック
■ operator bool()
シリアル通信が確立しているかを判定します。
if (Serial1)の形式で利用する時に、Serial1オブジェクトをブール型にキャストする際に呼びだれます。
戻り値
true :シリアル通信が確立している状態
false :シリアル通信が未確立の状態
利用例
code:sample1.ino
void setup() {
//Initialize serial and wait for port to open:
Serial1.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB
}
}
void loop() {
//proceed normally
}
関連項目
■ uint8 isConnected()
シリアル通信が確立しているかを判定します。
処理としては、operator bool()を呼び出してその結果を返しています。
code:code
uint8 isConnected() { return (bool) *this; };
本関数はArduinoとの互換性がありません。Arduino STM32ではif (Serial1)の利用を推奨しています。
戻り値
true :シリアル通信が確立している状態
false :シリアル通信が未確立の状態
■ unsigned int available()
読み込み可能(受信可能)なバイト数を返します。
戻り値
読み込み可能バイト数
シリアルバッファから取り出さずに次に受信する1バイト(文字)を返します。 つまり、peek()を連続して呼び出すと、次のread()の呼び出しと同じ文字が返されます。 peek()はStreamクラスから継承します。
戻り値
読み込み可能なデータの最初の1バイトを返します。
バッファにデータがない場合、-1の場合を返します。
■ int availableForWrite(void) 原文 書き込み操作をブロックすることなく、シリアルバッファに書き込み可能なバイト数(文字数)を取得します。
(注意):この関数は処理が実装されていません。常に1を返します。
戻り値
書き込み可能なバイト数:常に1を返します。
■ void flush(void)
発信シリアルデータの送信が完了するのを待ちます。
(注意)この動作は、Arduinoの仕様と同じ仕様です。USBSerialクラスのflush(void)と動作が異なることに注意して下さい。
低レベルデータ送信
■ size_t write(unsigned char ch)
1文字(1バイト)を送信します。 この関数は送信が完了するまでブロッキングします。
USBSerialクラスのwriteunsigned char ch)と動作が異なります。USBSerialクラスのwriteunsigned char ch)はブロッキングします。
これは低レベル関数です。 print()関数やprintln()関数の1つは、複数の文字を印刷する場合、印刷用の数値を書式化する場合などに便利です。
戻り値
送信したデータバイト数を返します。
■ size_t write(unsigned long n)
unsigned long型のデータ(4バイト)を送信します。
戻り値
送信したデータバイト数を返します。
■ size_t write(long n)
long型のデータ(4バイト)を送信します。
戻り値
送信したデータバイト数を返します。
■ size_t write(unsigned int n)
unsigned int型のデータ(4バイト)を送信します。
戻り値
送信したデータバイト数を返します。
■ size_t write(int n)
int型のデータ(4バイト)を送信します。
戻り値
送信したデータバイト数を返します。
■ size_t write(const char* str)
指定されたヌル終了文字列(\0が終端)をUSB接続経由で送信します。
内部的処理としては、 size_t write(void* buf, unsigned int size)を呼びでして1バイト送信を行っています。
戻り値
送信したデータバイト数を返します。
■ size_t write(void* buf, unsigned int size)
bufの最初のサイズバイトをUSB接続に書き込みます。 各バイトは個々の文字として送信されます。
戻り値
送信したデータバイト数を返します。
データ受信
■ unsigned char read()
利用可能な次の未読文字を返します。 使用可能な文字がない場合(使用可能な状態でこれをチェックすることができます)、データを受信するまでブロックされます。
戻り値
受信した1バイトデータを返します。
■int txPin(void)
シリアルオブジェクトの利用する送信(TXD)ピンのピン番号を返します。
■int rxPin(void)
シリアルオブジェクトの利用する受信(RXD)ピンのピン番号を返します。
■struct usart_dev* c_dev(void)
シリアルオブジェクトに割り付けられたデバイス(USARTデバイスの構造体変数のアドレス)を返します。
高レベルデータ送信
■ print(unsigned char b)
指定されたバイトデータbをUSB接続経由で出力します。
■ print(char c)
指定された文字cをUSB接続で印刷します。 通常、ASCIIテキストとして解釈されます。
■ print(const char* str)
指定したヌル終了文字列をUSB接続経由で出力します。
■ print(int n)
引数の数字を10進形式でUSB接続に出力します。 負の値には接頭辞 ' - 'が付きます。
■ print(unsigned int n)
引数の数字を10進形式でUSB接続に出力します。
■ print(long n)
引数の数字を10進形式でUSB接続に出力します。 負の値には接頭辞 ' - 'が付きます。
■ print(unsigned long n)
引数の数字を10進形式でUSB接続に出力します。
■ print(long n, int base)
baseを基底(2〜16の間でもよい)として、USB接続上にnの数字を表示します。 基底の2はバイナリ、8は8進数、10は10進数、16は16進数に対応します。 負の値には接頭辞 ' - 'が付きます。
■ print(double n)
小数点以下2桁まで正確なnを出力します。
■ println(char c)
print(c)の後に "\ r \ n"が続きます。
■ println(const char* c)
print(c)の後に "\ r \ n"が続きます。
■ println(unsigned char b)
print(b)の後に "\ r \ n"が続きます。
■ println(int n)
print(n)の後に "\ r \ n"が続きます。
■ println(unsigned int n)
print(n)の後に "\ r \ n"が続きます。
■ println(long n)
■ println(unsigned long n)
print(n)の後に "\ r \ n"が続きます。
■ println(long n, int base)
print(n、b)の後に "\ r \ n"が続きます。
■ println(double n)
print(n)の後に "\ r \ n"が続きます。
■ println()
"\ r \ n"を出力します。
ライブラリのドキュメント
Serial[1,2,3]オブジェクトはすべてこのセクションで説明されているHardwareSerialクラスのインスタンスです。 (つまり、Serial1、Serial2、およびSerial3のいずれかでこれらの関数を使用できます)。
Arduinoの互換性に関するメモ
Arduinoとは異なり、MapleのシリアルポートはMapleボードのUSBポートに接続されていません。 内蔵USBポートを使用して通信する場合は、代わりにSerialUSBを使用してください。 USARTとコンピュータの間で通信するには、追加のUSB /シリアルアダプタが必要です。
関連項目
このドキュメントはleafLabs, LLC.が執筆し、たま吉が翻訳・一部加筆修正したものです。