【マイコン】Serial通信のハードFlow制御の基礎実験<制御動作目視できた>

パワーメーター2019で初めてFLOW制御をいじってみました。しかし、本当の意味を理解していないためXbeeとマイコン間ではFLOW制御が不要な点に気づかずに、無駄なことをずいぶんしてしまいました。そこで、FLOW制御の基礎実験をして理解を深めました。

 

●FLOW制御の基礎実験(Nucleo L432KC 同士で通信)
仕入れたばかりのNucleo L432KC 2個間をシリアル接続します。
STM32マイコンのハードウェアFLOW制御の実験です。
115200bpsで通信します。
●やり方
「データの送信間隔をどんどん短くしていって制御がどうなるか実験」

使うピン名 ピンの役割 送り側L432KC クロス結線 受け側L432KC
TXピン データを送る出口 PA_2(UART2_TX)   X PA_2(UART2_TX)
RXピン データを受ける入口 PA_3(UART2_RX) PA_3(UART2_RX)
RTSピン Request To Send 送信要求 PA_1(UART2_RTS) X PA_1(UART2_RTS)
CTSピン Clear To Send   送信許可 PA_0(UART2_CTS) PA_0(UART2_CTS)

ピン名称の参照記事:http://www.sacom.co.jp/lecture/rs232c.html

   FLOW制御解説記事:
https://www.contec.com/jp/support/basic-knowledge/daq-control/serial-communicatin/
https://japan.moxa.com/upload/2010011907011614.pdf

➁プログラム
送り側  Xbee名でマイコン間シリアル接続します ASCIIで0x31=’1’ 1バイトを送信します

include “mbed.h”

DigitalOut myled(LED1);
Serial pc(USBTX,USBRX);
Serial xbee(PA_9,PA_10);//TX RX
int n=0;
char c;
int main() {
pc.baud(115200);
xbee.baud(115200);
//xbee.set_flow_control(Serial :: RTSCTS,PA_12,PA_11);//rts、cts
while(1) {
c=0x31;
n++;
pc.printf(“%d\n\r”,n);
xbee.printf(“%d\n\r”,n);
wait_ms(2);
//xbee.putc(c);
// pc.putc(c);
//xbee.putc(c);
//wait_us(100);
}
}

受け側 受けたバイトをPCへ表示させている

#include “mbed.h”

DigitalOut myled(LED1);
Serial pc(USBTX,USBRX);
Serial xbee(PA_9,PA_10);//Tx RX
int n=0;
int main() {
pc.baud(115200);
xbee.baud(19200);
//xbee.set_flow_control(Serial :: RTSCTS,PA_12,PA_11);//rts、cts
while(1) {
//n++;
//pc.printf(“n=%d\n\r”,n);
//xbee.printf(“n=%d\n\r”,n);
// wait_ms(10);
if (xbee.readable()){
pc.putc(xbee.getc());
}
}
}

●実験結果
①オシロ測定設定時 送信周期74μsec
送り側マイコンのTX(データ送信線):水色
受け側マイコンのCTS(データ
データは、下位4ビット上位4ビットの順で送信されてます
下位100011000上位=>逆に並べて0011 0001=>0x31となります

黄色のCTSの挙動はストップビット時にHIになって、一定時間で
LOWになります。LOWの時は通信許可なのか?HIの時に通信OKなのか?この時点ではまだわかりません。黄色で送信OKと書いてありますが、OK?なのかわからないということです。

➁送信周期を54μsecに短くすると

・CTSの立ち上がりエッジと下がりエッジがデータのスタートビットとストップビットが同期している

・CTSの周期が11456Hzまで高速化している115600bpsに接近
=>これをみるとストップビットを見てCTSがHIになって、HIの間にスタートビットが始まって
スタートビットーストップビット間はCTSがLOWとなって送信禁止となっていると解釈できるのでCTSは、HIで送信許容状態である

③送信周期49μsecにしたらFLOW制御の動作が見えた

・➁の54μsecで115200bps直近で、ぎりぎりだったのを少し早くした場合の現象
・最初は、CTS LOWなのにスタートビットが始まってしまって
制御ができてない状況が発生しました。(上のグラフ)
・数秒間みてると徐々にCTSの幅が広がってきて下のグラフの
ようになりました。これはST32の制御が動作しているのが目視
できたようです。
・結果として、ストップビットが過ぎてからCTS立ち上がりエッジになってスタートビット開始でCTS立下りエッジが同期して制御的には
通信中は、CTS LOWで送信禁止となって制御状態となってます

③送信周期30μsecにしてみた。
・CTSが逆転していて通信中にHIになってしまって制御不能になったようです。制御アルゴリズムが115200Hz基準に動作しているためだと思います。

 

 

④この制御不能状態からボーレートを230400bpsにあげると
・送信周期30μsecでは、制御不能に陥ってしまったので
送信速度を上げたらどうなるか実験すると
・①と同じ状態に戻りました。(オシロのDIVは10μsecになってます)
・この状態では、ストップビットとともCTSが立ち上がって、HIが5μsecつづいて勝手に下がってしまってますが、禁止状態のはずだけどスタートビットが入ってしまっているので制御ルールからはずれてますが、
制御アルゴリズム的には、余裕があるときは制御してないのかな?
と理解すれば①~④の挙動は理解できると思います。


 

●以後
  オシロで条件を振りながら通信を観察する面白さが分かったので、これからも機会がでたらやってみます。

 

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です