BASICスタンプコマンド
解説4

シリアルI/O



SERIN

文法
スタンプT
SERIN ピン番号, {,(比較修飾子,・・・)}, {{#}変数・・・}
スタンプU
SERIN ピン番号,{¥ハンドシェーク}, モード, {パリティーラベル,} {タイムアウト, タイムアウトラベル,} [変数・・・]

解説
 ピン番号で指定したピンから非同期RS232C信号を入力するコマンドです。全てのスタンプで使用できますが、記述の方法、性能がそれぞれのスタンプによってちがいます。
 RS232Cでは−12Vが”1”、+12Vが”0”ということになっているので通常のポートに直接接続することは出来ません(但し、プログラムポートはRS232C仕様になっている)。通常の回路はラインレシーバ(MAX232など)を通して信号を受信します。これは
1)±12Vを0−5Vへ変換する
2)論理を電圧あり=”1”、0V=”0”へ変換する
という働きをもっています。但し、スタンプのP0〜P15(スタンプTの場合はP7)は高い電圧入力をカットする機能がついているので論理は逆になりますが22KΩ程度の抵抗を入力に直列につなぐだけで入力ができます。

スタンプT:
 モード(下記表の名前または値のどちらかで指定)で指定したボーレート(300〜2400bps、下記表を参照)、極性、8ビット、ストップビット、パリティ有無でRS232C信号を受信します。
 もし、MAX232やラインレシーバーなどの反転シリアルバッファを使用している場合は表にある反転モード”NO”を使用し、TTLレベルの信号を受信する場合は反転モード”YES”を使います。反転モードで使用する場合はピンの先に抵抗(22KΩ)をつなぎ、RS232Cからの過剰な電流供給がスタンプ上のクランプダイオードに流れて破壊されるのを防ぎます。比較修飾子を追加することにより、その修飾子と同じ値、または文字列が入力されるまで入力を待ちます。比較修飾子は定数、変数、ダブルコーテーションマークでかこまれた文字列が使えます。比較修飾子の比較を終えた後、指定した変数へ入力された値を代入します。変数の前に”#”をつけることによりASCIIコードを数値へ変換し、変数へ格納します。
SERIN 0, T2400, #B1
ピン0をシリアル端末に接続し、上記プログラムを実行し、端末上(通信ソフトが動いてる状態)で”1”と”0”をタイプしたあとに数字以外の文字、たとえばスペースをタイプすると、B1には10が格納されます。
スタンプU:
  モード(下記表の名前または値のどちらかで指定)で指定したボーレート(300〜38400bps、下記表を参照)、極性、8ビット、ストップビット、パリティ有無でRS232C信号を受信します。PCと接続する場合は
サンプルプログラムの回路図例を参照願います。スタンプU(または2SX)の場合はTよりも細かい設定ができます。まずピン番号(1〜16)を指定します。さらにその後に¥マークに続いてハンドシェークを行うピン番号を指定することもできます(ハンドシェークを行わないことも当然できます。)。このハンドシェーク線はアウトプットモードに設定され、スタンプがデータを受信している間は”負”を、データを受信していない間は”正”を出力します。反転モード”YES”の場合は”1”が”負”、”0”が”正”、反転モード”NO”の場合は”1”が”正”、”0”が”負”となります。
反転モード
送信可
送信ストップ
YES

NO


 いま、ふつうのポートたとえばP0をデータ受信線、P1をフロー制御線に設定し、反転モードでデータを受信しているとすると、データ受信中にはP1が送信ストップである”0”になります。受信を終えると”1”になります。

 オープンコレクタモードはSEROUTコマンドに有効です。くわしくはSEROUTを参照願います。
 Uはさらに8ビットノンパリティーか7ビットイーブンパリティかの設定(Tは8ビットノンパリティーのみ)ができます。通常”7ビット・イーブンパリティ”は文字の送信、”8ビット・ノンパリティ”はバイトデータの送信に使われます。7ビットイーブンは1ビットをパリティに使っているのでそのぶん余計に送信時間がかかります。7ビットイーブンパリティーを指定した場合はパリティ−ラベルを記述することができます。もしパリティーエラーがあった場合はこのラベルへジャンプします。また、タイムアウト(0〜65535)の設定を1ms単位で設定可能です。もしこの時間の間になにも入力がなかった場合はタイムアウトラベルへジャンプします。また、タイムアウトを設定しない場合はなにかを入力されるまでスタンプは入力を待ちつづけます。
 スタンプUにはPCと直結するプログラミング用のポートがありますがこれをP16とし、シリアル入力用に使用することもできます。このピンは他のピンとは違いラインレシーバが内蔵されておりRS232Cレベルの電圧規格になっています。(オートエコー:スタンプのプログラミング入力ポートはプログラミング出力ポートと内部的につながっています。)
 各変数にはASCIIコードが格納されますが、下記表2の拡張子を追加することで入力値を数値に変換することができます。
表1 モード表
パラメータ(ボー, ビット,パリティ) 反転モード オープンコレクタ T U 2SX
名前
300/8/N YES NO T300 3 3313 -
300/8/N NO NO T300 7 19697 -
300/8/N YES YES OT300 11 36081 -
300/8/N NO YES ON300 15 52465 -
300/7/E YES NO - - 11505 -
300/7/E NO NO - - 27889 -
300/7/E YES YES - - 44273 -
300/7/E NO YES - - 60657 -
600/8/N YES NO T600 2 1646  
600/8/N NO NO N600 6 18030  
600/8/N YES YES OT600 10 34414  
600/8/N NO YES ON600 14 50798  
600/7/E YES NO - - 9838  
600/7/E NO NO - - 26222  
600/7/E YES YES - - 42606  
600/7/E NO YES - - 58990  
1200/8/N YES NO T1200 1 813 2063
1200/8/N NO NO N1200 5 17197 18447
1200/8/N YES YES OT1200 9 33581  
1200/8/N NO YES ON1200 13 49965  
1200/7/E YES NO - - 9005 10255
1200/7/E NO NO - - 25389 26639
1200/7/E YES YES - - 41773  
1200/7/E NO YES - - 58157  
2400/8/N YES NO T2400 0 396 1021
2400/8/N NO NO N2400 4 16780 17405
2400/8/N YES YES OT1200 8 33164  
2400/8/N NO YES ON1200 12 49548  
2400/7/E YES NO - - 8588 9213
2400/7/E NO NO - - 24972 25597
2400/7/E YES YES - - 41356  
2400/7/E NO YES - - 57740  
4800/8/N YES NO - - 188 500
4800/8/N NO NO - - 16572 16884
4800/8/N YES YES - - 32956  
4800/8/N NO YES - - 49340  
4800/7/E YES NO - - 8380 8692
4800/7/E NO NO - - 24764 25076
4800/7/E YES YES - - 41148  
4800/7/E NO YES - - 57532  
9600/8/N YES NO - - 84 240
9600/8/N NO NO - - 16468 16624
9600/8/N YES YES - - 32852  
9600/8/N NO YES - - 49236  
9600/7/E YES NO - - 8276 8432
9600/7/E NO NO - - 24660 24816
9600/7/E YES YES - - 41044  
9600/7/E NO YES - - 57428  
19200/8/N YES NO - - 32 110
19200/8/N NO NO - - 16416  
19200/8/N YES YES - - 32800  
19200/8/N NO YES - - 49183  
19200/7/E YES NO - - 8224  
19200/7/E NO NO - - 24608  
19200/7/E YES YES - - 40992  
19200/7/E NO YES - - 57376  
38400/8/N YES NO - - 6  
38400/8/N NO NO - - 16390  
38400/8/N YES YES - - 32774  
38400/8/N NO YES - - 49158  
38400/7/E YES NO - - 8198  
38400/7/E NO NO - - 24582  
38400/7/E YES YES - - 40966  
38400/7/E NO YES - - 57350  

表2 スタンプU変数拡張子
拡張子

効果

DEC
1-5
10進で入力
DEC W1, DEC3 W2
SDEC
1-5
符号付き10進
SDEC W1, SDEC3 W2
HEX
1-4
16進
HEX W1, HEX4 W2
SHEX
1-4
符号付16進
SHEX W1, SHEX4 W2
IHEX
1-4
$マーク付き16進数
IHEX W1, IHEX4 W2
ISHEX
1-4
$、符号付き16進
ISHEX W1, ISHEX4 W2
BIN
1-16
2進数
BIN W1, BIN8 B5
SBIN
1-16
符号付き2進
SBIN W1, SBIN8 B5
IBIN
1-16
%マーク付き2進
IBIN W1, IBIN4 B5
ISBIN
1-16
%、符号付き2進
ISBIN W1, ISBIN4 B5
STR バイト配列\L {\E}
-
バイト配列にL個データを入れる。Lで指定した文字が来たらそこで受信を中止する。
STR 配列名 \5
WAIT
-
カッコの中のキャラクター(6文字まで)を待つ。
WAIT (13,10,B1)
WAIT("READY")
WAITSTR
-
バイトアレイ中のテキストを待つ。
WAITSTR 配列名
SKIP
数値
指示したバイト数をスキップする。
SKIP 22

array VAR BYTE(10)
SERIN 0,84,[STR array\9\"*"] :配列arrayの0−9に結果を入れるが*が入力された時点で終了。のこりの配列には0が入る

SERIN0,84,[WAIT("SESAME")] :SESAMEの文字が送られてくるまで待つ

サンプルプログラム
PCと下記のように接続し、キーボードの”A”を押すとP1の出力が切り替わる
loop:
serin 0,16468,[b1]
if b1=97 then Change 
'97はアスキーコードで”a"
goto loop
Change:
toggle 1
goto loop
図SB5-1
PCからAのキーを押すたびにP1につなげられたLEDが点滅します。PCのハイパーターミナルなどの通信ソフトを立ち上げて9600bps、ノンパリティー、8ビット、フロー制御なし、に設定しターミナル上でAキーを押して見て下さい。

スタンプTの場合(和を返す)
loop:
SERIN 0, T2400,(#W1,B9,#W2)
IF B9<>"+" THEN error
W3=W1+W2
SEROUT 1,T2400,(#W3,CR)
GOTO loop
error:
SEROUT 1,T2400,("Again",13)
GOTO loop

スタンプUの場合(和または差を返す)
A1 VAR WORD
A2 VAR WORD
OP BAR BITE
loop:
SEROUT 16,84,["? "]
SERIN 16,84,[SDEC A1, OP, SDEC A2]
IF OP="+" THEN goadd
IF OP="-" THEN gosub
SEROUT 16,84,["Again",13]
GOTO loop
goadd:
SEROUT 16,84,[SDEC A1+A2,13]
GOTO loop
gosub:
SEROUT 16,84,[SDEC A1-A2,13]
GOTO loop


SEROUT

文法
スタンプT
SEROUT ピン番号, モード, ({#}データ,・・・)
スタンプU
SEROUT ピン番号, モード, {ペース,} [データ,・・]
SEROUT ピン番号¥ハンドシェーク, モード, {タイムアウト, タイムアウトラベル,} [データ,・・・]

解説
 ピン番号で指定したピンからモードで設定したスピードなど(SERINのモード表を参照願います)でRS232Cへ出力するのに適しているデータを出力するコマンドです。スタンプはRS232Cの規格、+12Vまたは−12V、の電圧ではなく、TTL規格の0Vまたは5Vで動作しているのでRS232C端末との接続およびデータ出力には通常はドライバ回路が必要です、が、スタンプ内に5V以上の電圧をカットする回路が内蔵されているので直結しても問題無く動作します。但しこの再に論理が逆になりますので”反転モード”(SERINのモード表を参照願います)で送信する必要があります。
 スタンプTの場合はピン番号で指定したピンから、モードで設定した設定(SERINの表を参照)でデータを出力します。#をつけると数値をASCIIコードに変換して出力します。データはすべて1バイト単位で出力します。
スタンプUの場合
 スタンプUのP16はプログラムポート以外にもシリアル出力用として使用できます。このピンはRS232Cの電圧レベルになっています。
出力は定数、変数、ダブルコーテーションマークで囲まれた文字列、と表の拡張子が使えます。
図SB5-2
serout 2,16468,["Hellow"]
上記はPCにHellowを送信するプログラムです。このプログラムをスタンプにロードした後、回路を組んでPCに接続し、PC上でハイパーターミナルなどの通信ソフトを立ち上げ(9600bps、8ビット、ノンパリティー、フロー制御なし)スタンプをリセットすると、通信ソフト上にHellowと表示されます。
 ペース(0〜65535)は出力するデータ間のポーズ時間を1ms単位で設定します。
SEROUT 1,16468,1000,["SLOW"]
とすると、S・L・O・Wの各文字を一秒ごとに送信します。
 もし、データのフロー制御を行いたい場合はピン番号のあとに¥とつけたピン番号を追加することでそのピンをフロー制御線とすることが出来ます。論理は下記の通りです。
反転モード
送信可
送信ストップ
YES

NO


SEROUT 1\0,16468,["Hellow"]
とするとP0でフロー制御を行いながらP1からHellowを送信します。ここで問題なのは受信側が受信状態にならない、例えばつながっていない場合はスタンプは送信可にならないため、スタンプは止まってしまいます。
フロー制御を行う場合はタイムアウト(0〜65535mS)時間を設定でき、設定した時間以上送信できない状態がつづくとタイムアウトラベルで表した場所へジャンプします。これによりこの問題を解消できます。
SEROUT 1\0,16468,2500,NoFlow,["Hellow"]
とすると2.5秒間送信可にならない場合はNoFlowへジャンプします。
 どちらのスタンプ(TまたはU)もオープンコレクタRS232Cモードを使用することができます。(但しスタンプUで16ピンを使用している場合は除く)これにより、プルアップ又はプルダウン抵抗を接続し、スタンプ同士のシリアル接続が可能となります。スタンプ同士を普通のモードで接続すると、片方が”1”つまり5V、もう一方が”0”で0Vの時にショートになってしまいスタンプがダメージを受けます。オープンコレクタモード時は通信線がドライブの状態か開放(物理的に線をカットする状態)かの状態となります。その時の論理と回路は下記のようになります。
状態
反転モード
非反転モード
プルアップ

開放
ドライブ
GND

ドライブ
開放
5V


 送信データには下記の拡張子をつけることもできます。
拡張子

効果
ASC?
-
ASCIIで出力
ASC B2
DEC
1-5
10進テキストで出力
DEC W1, DEC3 W2
SDEC
1-5
符号付き10進テキスト
SDEC W1, SDEC3 W2
HEX
1-4
16進テキスト
HEX W1, HEX4 W2
SHEX
1-4
符号付16進テキスト
SHEX W1, SHEX4 W2
IHEX
1-4
$マーク付き16進数テキスト
IHEX W1, IHEX4 W2
ISHEX
1-4
$、符号付き16進テキスト
ISHEX W1, ISHEX4 W2
BIN
1-16
2進数テキスト
BIN W1, BIN8 B5
SBIN
1-16
符号付き2進テキスト
SBIN W1, SBIN8 B5
IBIN
1-16
%マーク付き2進テキスト
IBIN W1, IBIN4 B5
ISBIN
1-16
%、符号付き2進テキスト
ISBIN W1, ISBIN4 B5


サンプルプログラム
SEROUT 0, 84, [ 65 ] :値65を出力
SEROUT 0, 84, ["A"] :文字Aを出力
SEROUT 0, 84, [HEX2 0F] :文字0Fを出力
SEROUT 0, 84, [ISBN8 01011010] :文字%01011010を出力
SEROUT 0,84, 1000, ["HELLOW"] :一秒おきに一文字ずつ送信



SHIFTIN

U、2SXのみ

文法
SHIFTIN データピン, クロックピン, モード, [変数{¥ビット},{・・・}]

解説
 データピンで指定したピンから同期シリアル通信の入力を行うコマンドです。2つのピンを使い、入力とクロックの同期を行います。Uは16KHz,2SXは42KHzの周波数のパルスをクロックピンで指定したピンから出力します。クロックピンで指定したポートは同期通信をする装置のクロック入力端子に接続します。モードでビットが送られてくる順番とパルスのどの部分でデータ入力を行うかを設定します。モードは名前または値のどちらかで設定します。
 同期通信はADコンバータ、DAコンバータ、メモリー素子などとの通信によく使われます。
<モード表>
名前
設定
MSBRE

MSBから入力、クロックの立ち上がり時
LSBPRE

LSBから入力、クロックの立ち上がり時
MSBPOST

MSBから入力、クロックの立ち下がり時
LSBPOST

LSBから入力、クロックの立ち下がり時

MSBはそのデータが最大ビット(一番左のビット)から送られてきます。LSBは最小ビット(一番右のビット)からおくられてきます。ビットは送られてくるデータの長さを表します。なにも書かない場合はデフォルトで8です。
図SB5-3

サンプルプログラム
SHIFTIN 0,1,MSBPRE,[B1] :8ビットデータをB1へ
SHIFTIN 0,1,MSBPRE,[W1\16,B2\1] :16ビットのデータを受け取った後、1ビットをB2へ


SHIFTOUT

U、2SXのみ

文法
SHIFTOUT データピン, クロックピン, モード, [{¥ビット}{,・・・}]

解説
SHIFTINとは逆にデータの出力を同期をとりながらデータピンで指定したポートからデータ送信を行います。クロックピンで指定したポートは同期通信をする装置のクロック入力端子に接続し、SHIFTINと同じタイミングの波形を送信します。モードは最大ビットから送るMSBFIRSTと最小ビットから送るのLSBFIRSTの2つがあります。
名前

設定
LSBFIRST

LSBから出力
MSBFIRST

MSBから出力

図SB5-4

サンプルプログラム
SHIFTOUT 0,1,MSBFIRST,[B1]



テーブル


LOOKUP

文法
スタンプT
LOOKUP インデックス, (値0, 値1,・・・), 変数
スタンプU、2SX
LOOKUP インデックス, [値0, 値1,・・・], 変数

解説
カッコ(スタンプUの場合は中カッコ[ ])でかこまれたデータリストの中からインデックスで指定した値を変数へ格納するコマンドです。インデックスが0の場合は1番初め、1の場合は2番目・・・の値をデータリストから拾い、変数へ格納します。もしインデックスの値がデータリスト中の値の数より大きい場合は変数は変更されません。

サンプルプログラム
B2=101
LOOKUP B1, [19, 57, 35, 27],B2
B1が0ならB2は19、1なら57、2なら35、3なら27、4以上なら101となります。
主にFOR文と組み合わせてある決まったデータ列を順番に取り出す処理に使います。


LOOKDOWN

文法
スタンプT
LOOKDOWN インデックス, (値0, 値1,・・・), 変数
スタンプU、2SX
LOOKDOWN インデックス, {演算子} [値0, 値1,・・・], 変数

解説
 インデックスで指定した値がカッコ(Uの場合は中カッコ)でかこまれたデータリスト中にあればその順番を変数に代入するコマンドです。データリストは文字列を入れることもできます。たとえばデータリストが[”ABCDEF”]でインデックスが”C”だった場合は結果は2になります。リストの中に該当する値が無かった場合は変数の値は変わりません。
 スタンプUの場合はさらに演算子を指定し、リストとの比較を行うことができます。演算子は=、<、>、<>、<=、>=です。LOOKDOWNはデータリストとインデックスに正の値のみしか使用できません。(マイナスは不可)また、カッコの中の値はバイトタイプしか扱えません。


サンプルプログラム
B1="C"
LOOKDOWN B1,["ABCDEF"],B2
結果はB2=”2”(Aは0、Bは1、Cは2番目)
B1="C"
LOOKDOWN B1,["GHIJK"],B2
結果はB2=”C”(該当無しで値は変わらず)

VALUE VAR BYTE
RESULT VAR NIB
VALUE=17
LOOKDOWN VALUE,>[26,177,13,1,0,17,99],RESULT
結果はRESULT=2となります。これはVALUE>13で初めて式が成り立ち、13が2番目にあるので結果は2になります。


ロボット作成教室のもくじへBack

次へ進む

Home