2010.01.15

H8マイコンとFlashでシリアル通信


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に文字列を送るプログラムを書きました。

C:
  1. #include <3048.h>
  2. #include "h8_lcd.h"
  3.  
  4. void init(void);
  5. void wait(void);
  6.  
  7. //================================================
  8. //  メイン関数
  9. //================================================
  10. void main(void){
  11.     char txb[10], rxb[10];
  12.     init();
  13.     EI; //割り込み許可
  14.     SCI1_INIT(br38400, txb, sizeof(txb), rxb, sizeof(rxb));
  15.     SCI1_PRINTF("<program start>\r\n");
  16.     while(1){
  17.         if(!P4.DR.BIT.B4){        // sw1が押された
  18.             LCD_disp("btn1 pushed", 1);
  19.             SCI1_PRINTF("btn1 pushed\n");
  20.         }
  21.         else if(!P4.DR.BIT.B5){   // sw2が押された
  22.             LCD_disp("btn2 pushed", 1);
  23.             SCI1_PRINTF("btn2 pushed\n");
  24.         }
  25.         else if(!P4.DR.BIT.B6){   // sw3が押された
  26.             LCD_disp("btn3 pushed", 1);
  27.             SCI1_PRINTF("btn3 pushed\n");
  28.         }
  29.         else if(!P4.DR.BIT.B7){   // sw4が押された
  30.             LCD_disp("btn4 pushed", 1);
  31.             SCI1_PRINTF("btn4 pushed\n");
  32.         }
  33.         else{                     // swが押されていない
  34.             LCD_disp("           ", 1);
  35.         }
  36.         wait();
  37.     }
  38. }
  39.  
  40. //================================================
  41. //  いろいろ初期化
  42. //================================================
  43. void init(void){
  44.     P4.DDR = 0x00;      //port4入力に設定 操作用sw1?4
  45.     P4.PCR.BYTE = 0xff;  //port4プルアップon
  46.     P5.DDR = 0xff;      //port5出力に設定 表示LED
  47.     P5.PCR.BYTE = 0x00;  //port5プルアップoff
  48.    
  49.     LCD_init( 16 );
  50.     LCD_disp("!", 2);
  51. }
  52.  
  53. //================================================
  54. //  時間稼ぎ
  55. //================================================
  56. void wait(void){
  57.     int i;
  58.     for (i=0;i<0xffff;i++);
  59.     return;
  60. }

h8_lcd.hはマザーボードのLCD表示用です。
ここから拝借。
SCI1_PRINTF関数で簡単に送信できます。(GDLのおかげ)

AS3の方はほぼサンプルプログラム通り。FDで動くようにしただけ。

Actionscript:
  1. /*
  2.   FNCCを使ってみるサンプル
  3.   flashCS3
  4.   flashplayer9
  5.   Create Date: 2007/11/18
  6.   Author: Hirotaka Hatayama
  7.   WebSite: http://www.hatayan.org
  8. */
  9. package {
  10.     import flash.display.Sprite;
  11.     import flash.events.*;
  12.     import flash.errors.*;
  13.     import flash.text.TextField;
  14.     import org.hatayan.flashNetComportConnector.*;
  15.     import org.hatayan.flashNetComportConnector.Event.*;
  16.     public class FnccTest extends Sprite {
  17.         private const SOCKET:String = "Localhost";
  18.         private var sp:SerialPort;
  19.         private var bt1:Sprite;
  20.         private var bt2:Sprite;
  21.         private var bt3:Sprite;
  22.         private var bt4:Sprite;
  23.         private var textArea:TextField;
  24.         private var textInput:TextField;
  25.        
  26.         public function FnccTest() {
  27.             //ボタン作成
  28.             bt1 = createBtn(00, 100, 30, 0xFF0000);
  29.             bt2 = createBtn(0, 30, 100, 30, 0x00FF00);
  30.             bt3 = createBtn(0, 60, 100, 30, 0x0000FF);
  31.             bt4 = createBtn(0, 90, 100, 30, 0xFFFF00);
  32.             addChild(bt1);
  33.             addChild(bt2);
  34.             addChild(bt3);
  35.             addChild(bt4);
  36.            
  37.             //テキストエリア
  38.             textArea = new TextField();
  39.             addChild(textArea);
  40.             textArea.x = 0;
  41.             textArea.y = 120;
  42.             textArea.width = stage.stageWidth;;
  43.             textArea.height = 1000;
  44.             textArea.scaleX = textArea.scaleY = 10;
  45.            
  46.             textInput = new TextField();
  47.             addChild(textInput);
  48.             textInput.type = "input";
  49.             textInput.x = 100;
  50.             textInput.y = 0;
  51.            
  52.             sp = new SerialPort();
  53.             sp.addEventListener(SerialEvent.ON_STR_DATA,strDataHandler);
  54.             sp.addEventListener(Event.CONNECT,connectHandler);
  55.             sp.addEventListener(Event.CLOSE,closeHandler);
  56.             sp.addEventListener(Event.CONNECT,connectHandler);
  57.             sp.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
  58.             sp.addEventListener(ProgressEvent.PROGRESS,progressHandler);
  59.             sp.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);
  60.             sp.addEventListener(SerialErrorEvent.FULL_CONNECTION_ERROR,fullConnectionErrorHandler);
  61.             sp.addEventListener(SerialErrorEvent.CONNECT_ERROR, connectErrorHandler);
  62.            
  63.             //ボタンクリックされて時の処理
  64.             bt1.addEventListener(MouseEvent.CLICK,function(e:Event){;
  65.             sp.sendString(textInput.text);
  66.             });
  67.  
  68.             bt2.addEventListener(MouseEvent.CLICK,function(e:Event){;
  69.             sp.openRemoteComport(SOCKET,1888);
  70.             });
  71.             bt3.addEventListener(MouseEvent.CLICK,function(e:Event){;
  72.             sp.close();
  73.             });
  74.             bt4.addEventListener(MouseEvent.CLICK,function(e:Event){;
  75.             textArea.text="";
  76.             });
  77.            
  78.         }
  79.         function strDataHandler(event:SerialEvent) {
  80.             myTrace(event.strData);
  81.             textInput.text = event.strData;
  82.             trace(event.strData);
  83.         }
  84.         //つながったとき
  85.         function connectHandler(event:Event):void {
  86.             myTrace("connectHandler: " + event);
  87.         }
  88.         function connectErrorHandler(event:SerialErrorEvent):void {
  89.             myTrace("connectErrorHandler: " + event.message);
  90.         }
  91.         //ソケットがサーバーによって閉じられた時
  92.         function closeHandler(event:Event):void {
  93.             myTrace("closeHandler: " + event);
  94.         }
  95.         //サーバーへのコネンクションが一杯になりエラーが起こったとき
  96.         function fullConnectionErrorHandler(event:SerialErrorEvent):void {
  97.             myTrace("fullConnectionErrorHandler: " + event);
  98.         }
  99.         //エラーが来たとき
  100.         function ioErrorHandler(event:IOErrorEvent):void {
  101.             myTrace("ioErrorHandler: " + event.text);
  102.         }
  103.         //送信中の状態
  104.         function progressHandler(event:ProgressEvent):void {
  105.             myTrace("progressHandler loaded:" + event.bytesLoaded + " total: " + event.bytesTotal);
  106.         }
  107.         //セキュリティーエラーが起こったとき
  108.         function securityErrorHandler(event:SecurityErrorEvent):void {
  109.             myTrace("securityErrorHandler: " + event);
  110.         }
  111.         //UIに値を表示
  112.         function myTrace(param:String) {
  113.             textArea.text = param +"\n"+textArea.text;
  114.         }
  115.        
  116.         private function createBtn(_x:Number, _y:Number, _w:Number, _h:Number, color:uint):Sprite {
  117.             var s:Sprite = new Sprite;
  118.             s.buttonMode = true;
  119.             s.graphics.beginFill(color);
  120.             s.graphics.drawRect(_x, _y, _w, _h);
  121.             s.graphics.endFill();
  122.             return s;
  123.         }
  124.     }
  125. }

動かしてみる

まず、デバイスマネージャを開いて、ポート番号を調べる。

僕のPCではCOM17だった。

次にFNCCを起動して、設定する。

port numberはさっき調べたやつ。
設定できたら、Startボタンを押す。

マイコンの電源を入れてスイッチを押してみると、

できた!(ケータイ画質でごめんなさい)

もし、できなかったらFNCCのIP Adressを自分のIPアドレスにして
AS3の private const SOCKET:String にも同じのを書くとできるかも。

One Response to “H8マイコンとFlashでシリアル通信”

  • Cool Machine

    so cool

    2010.04.26, コメント by Zern

コメントをどうぞ。

TrackBack URI :