H8マイコンとFlashでシリアル通信
H8マイコンとかの準備
使ったのは多分これとおなじやつ
AKI-H8/3048開発キット(即使えるキット)[CPU/マザー/電源/アセンブラ/ソフト付]: 組み立てキット
H8マイコンとマザーボードを組み立てます。
AKI-H8コウザ
3.AKI-H8開発キットの回路
僕のPCにはRS232Cの端子がなかった(普通ない)ので、変換ケーブルも用意しました。
アナログモデム・RS-232C|USB-RSAQ3シリーズ|概要|ICリーダー・ライター/通信|IODATA アイ・オー・データ機器
マザーボードから変換ケーブルまでの接続はこれ
サンワサプライ:KR-MD2【RS-232Cケーブル(TA・モデム用・2m)
開発環境の準備
マイコンに書き込むプログラム(C言語)の開発には、
BesttechnologyのGCC Developer Lite(以下GDL)を使用しました。
こちらからダウンロードできます。
あと、いろいろ作業が必要だった気がするけど忘れた。(思い出したら書きます)
Flash(AS3)の方は、FlashDevelop(以下FD)で開発しました。
シリアル通信プロクシサーバ
Flashでは直接シリアルポートにアクセス出来ないので、
Flashとシリアルポートを中継するシリアル通信プロクシサーバが必要です。
Flash(AIR)でシリアル制御する方法まとめ ? TECH Matari
今回シリアル通信プロクシサーバは、Flash Net Comport Connector(以下FNCC)を使用しました。
こちらからダウンロードできます。
これで準備完了。
プログラム
マザーボード上のタクトスイッチを押すと、シリアル通信でFlashに文字列を送るプログラムを書きました。
-
#include <3048.h>
-
#include "h8_lcd.h"
-
-
void init(void);
-
void wait(void);
-
-
//================================================
-
// メイン関数
-
//================================================
-
void main(void){
-
char txb[10], rxb[10];
-
init();
-
EI; //割り込み許可
-
SCI1_INIT(br38400, txb, sizeof(txb), rxb, sizeof(rxb));
-
SCI1_PRINTF("<program start>\r\n");
-
while(1){
-
if(!P4.DR.BIT.B4){ // sw1が押された
-
LCD_disp("btn1 pushed", 1);
-
SCI1_PRINTF("btn1 pushed\n");
-
}
-
else if(!P4.DR.BIT.B5){ // sw2が押された
-
LCD_disp("btn2 pushed", 1);
-
SCI1_PRINTF("btn2 pushed\n");
-
}
-
else if(!P4.DR.BIT.B6){ // sw3が押された
-
LCD_disp("btn3 pushed", 1);
-
SCI1_PRINTF("btn3 pushed\n");
-
}
-
else if(!P4.DR.BIT.B7){ // sw4が押された
-
LCD_disp("btn4 pushed", 1);
-
SCI1_PRINTF("btn4 pushed\n");
-
}
-
else{ // swが押されていない
-
LCD_disp(" ", 1);
-
}
-
wait();
-
}
-
}
-
-
//================================================
-
// いろいろ初期化
-
//================================================
-
void init(void){
-
P4.DDR = 0x00; //port4入力に設定 操作用sw1?4
-
P4.PCR.BYTE = 0xff; //port4プルアップon
-
P5.DDR = 0xff; //port5出力に設定 表示LED
-
P5.PCR.BYTE = 0x00; //port5プルアップoff
-
-
LCD_init( 16 );
-
LCD_disp("!", 2);
-
}
-
-
//================================================
-
// 時間稼ぎ
-
//================================================
-
void wait(void){
-
int i;
-
for (i=0;i<0xffff;i++);
-
return;
-
}
h8_lcd.hはマザーボードのLCD表示用です。
ここから拝借。
SCI1_PRINTF関数で簡単に送信できます。(GDLのおかげ)
AS3の方はほぼサンプルプログラム通り。FDで動くようにしただけ。
-
/*
-
FNCCを使ってみるサンプル
-
flashCS3
-
flashplayer9
-
Create Date: 2007/11/18
-
Author: Hirotaka Hatayama
-
WebSite: http://www.hatayan.org
-
*/
-
package {
-
import flash.display.Sprite;
-
import flash.events.*;
-
import flash.errors.*;
-
import flash.text.TextField;
-
import org.hatayan.flashNetComportConnector.*;
-
import org.hatayan.flashNetComportConnector.Event.*;
-
public class FnccTest extends Sprite {
-
private const SOCKET:String = "Localhost";
-
private var sp:SerialPort;
-
private var bt1:Sprite;
-
private var bt2:Sprite;
-
private var bt3:Sprite;
-
private var bt4:Sprite;
-
private var textArea:TextField;
-
private var textInput:TextField;
-
-
public function FnccTest() {
-
//ボタン作成
-
bt1 = createBtn(0, 0, 100, 30, 0xFF0000);
-
bt2 = createBtn(0, 30, 100, 30, 0x00FF00);
-
bt3 = createBtn(0, 60, 100, 30, 0x0000FF);
-
bt4 = createBtn(0, 90, 100, 30, 0xFFFF00);
-
addChild(bt1);
-
addChild(bt2);
-
addChild(bt3);
-
addChild(bt4);
-
-
//テキストエリア
-
textArea = new TextField();
-
addChild(textArea);
-
textArea.x = 0;
-
textArea.y = 120;
-
textArea.width = stage.stageWidth;;
-
textArea.height = 1000;
-
textArea.scaleX = textArea.scaleY = 10;
-
-
textInput = new TextField();
-
addChild(textInput);
-
textInput.type = "input";
-
textInput.x = 100;
-
textInput.y = 0;
-
-
sp = new SerialPort();
-
sp.addEventListener(SerialEvent.ON_STR_DATA,strDataHandler);
-
sp.addEventListener(Event.CONNECT,connectHandler);
-
sp.addEventListener(Event.CLOSE,closeHandler);
-
sp.addEventListener(Event.CONNECT,connectHandler);
-
sp.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
-
sp.addEventListener(ProgressEvent.PROGRESS,progressHandler);
-
sp.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);
-
sp.addEventListener(SerialErrorEvent.FULL_CONNECTION_ERROR,fullConnectionErrorHandler);
-
sp.addEventListener(SerialErrorEvent.CONNECT_ERROR, connectErrorHandler);
-
-
//ボタンクリックされて時の処理
-
bt1.addEventListener(MouseEvent.CLICK,function(e:Event){;
-
sp.sendString(textInput.text);
-
});
-
-
bt2.addEventListener(MouseEvent.CLICK,function(e:Event){;
-
sp.openRemoteComport(SOCKET,1888);
-
});
-
bt3.addEventListener(MouseEvent.CLICK,function(e:Event){;
-
sp.close();
-
});
-
bt4.addEventListener(MouseEvent.CLICK,function(e:Event){;
-
textArea.text="";
-
});
-
-
}
-
function strDataHandler(event:SerialEvent) {
-
myTrace(event.strData);
-
textInput.text = event.strData;
-
trace(event.strData);
-
}
-
//つながったとき
-
function connectHandler(event:Event):void {
-
myTrace("connectHandler: " + event);
-
}
-
function connectErrorHandler(event:SerialErrorEvent):void {
-
myTrace("connectErrorHandler: " + event.message);
-
}
-
//ソケットがサーバーによって閉じられた時
-
function closeHandler(event:Event):void {
-
myTrace("closeHandler: " + event);
-
}
-
//サーバーへのコネンクションが一杯になりエラーが起こったとき
-
function fullConnectionErrorHandler(event:SerialErrorEvent):void {
-
myTrace("fullConnectionErrorHandler: " + event);
-
}
-
//エラーが来たとき
-
function ioErrorHandler(event:IOErrorEvent):void {
-
myTrace("ioErrorHandler: " + event.text);
-
}
-
//送信中の状態
-
function progressHandler(event:ProgressEvent):void {
-
myTrace("progressHandler loaded:" + event.bytesLoaded + " total: " + event.bytesTotal);
-
}
-
//セキュリティーエラーが起こったとき
-
function securityErrorHandler(event:SecurityErrorEvent):void {
-
myTrace("securityErrorHandler: " + event);
-
}
-
//UIに値を表示
-
function myTrace(param:String) {
-
textArea.text = param +"\n"+textArea.text;
-
}
-
-
private function createBtn(_x:Number, _y:Number, _w:Number, _h:Number, color:uint):Sprite {
-
var s:Sprite = new Sprite;
-
s.buttonMode = true;
-
s.graphics.beginFill(color);
-
s.graphics.drawRect(_x, _y, _w, _h);
-
s.graphics.endFill();
-
return s;
-
}
-
}
-
}
動かしてみる
まず、デバイスマネージャを開いて、ポート番号を調べる。

僕のPCではCOM17だった。
次にFNCCを起動して、設定する。

port numberはさっき調べたやつ。
設定できたら、Startボタンを押す。
マイコンの電源を入れてスイッチを押してみると、

できた!(ケータイ画質でごめんなさい)
もし、できなかったらFNCCのIP Adressを自分のIPアドレスにして
AS3の private const SOCKET:String にも同じのを書くとできるかも。


Cool Machine
so cool