• 締切済み

マイコンを用いたバイナリー形式での通信の方法

eroermineの回答

  • eroermine
  • ベストアンサー率18% (83/444)
回答No.1

一つの方法はテキストにエンコードする。 現在Webで使ってる Base64ではなく 16進数にして一行 40バイト分くらいづつ送る。 TCP/IPと違って転送に信頼性が無いから checksum CRC等入れると良い。 具体的には http://www.starlet.co.jp/column/hexfile.htm XMODEMを使う。 簡単なバイナリ-転送のプロトコルがあります。 エラーリトライをするので転送成功率が上がります。

uhpa
質問者

お礼

お礼のご回答が遅れ、申し訳ありません。 ご回答いただきました情報をもとに、考察してみます。

関連するQ&A

  • RS232Cを用いたSCIでのシリアル通信について

    PCで計算して吐き出した5~6個の数値データ(それぞれ3桁の数字で最大2バイトあれば足りる大きさです)をRS232Cを使ってSCIでマイコンに送り、マイコン側でそのデータを使って計算する、というシステムを考えています。 色々勉強してみたのですが、例えばPC側プログラムがテキストデータで吐き出した数値を読み込んで送信する場合、全てアスキーコードで送られてしまうのでしょうか?少なくともキーボード入力の値はアスキーコードで送られているようだとはわかりましたが・・・。 また、まだアルゴリズムは考えてませんが、PC側の計算プログラムから直接に数値をPC側送信プログラムに渡してあげた場合は、やはりそのままの値(例えば8なら1バイト2進法で00001000で送られるものなのでしょうか? 開発環境はC言語で、マイコンはSH2だということです。通信は今はテスト段階でハイパーターミナルを使っていますが、いずれは命令を出したときに適切な値を送信するようにしたいので、C言語で書かれたSCI通信のフリーウェアなどを使う検討もしています。 その理由はC言語プログラムの中にハイパーターミナルをどのように含めればいいのかわからなくて・・・ C言語でできたソフトなら、そのままPC側計算プログラムに組み込めばいいかなぁと思いまして・・・。(浅はか?) この点についてもご教授頂ければ幸いです。 説明不足かもしれませんが、その場合はご指摘ください。 どうぞ、宜しくお願いいたします。

  • PCとマイコンとのシリアル通信

    マイコンとパソコンでシリアル通信を考えています。 WEB検索すると「TeraTerm」というソフトにたどり着きました。 通信はバイナリです。(ASCII文字でのやり取りは行いません) 例えば、  マイコンボード上にトグルSWとLEDランプが実装されているとします。  ・PCからトグルSWコマンド「0Ah」をマイコンに送信。  ・マイコンはトグルSWの状態をONなら「00h」をOFFなら「01h」をPCに返信。  ・PCは返信データが「00h」なら、LED点灯コマンド「0Ch」をマイコンに送信。  ・PCは返信データが「01h」なら、LED消灯コマンド「0Dh」をマイコンに送信。 みたいなことを行いたいです。 TeraTermでどのように記述してよいかわからないです。 このへんを教えてくださいよろしくお願いします。

  • H8マイコンでの割り込み(シリアルポート入力で)

    マイコン:AKI H8/3048F 開発環境:GCC Developer Lite マイコンとパソコンをRS-232Cケーブルでつないでいます。 ハイパーターミナルを使用して、マイコンを制御したいと考えております。 それで、パソコンのキーボードから入力があった時だけ、割り込みを実行したいです。 割り込みが無い場合は、パソコンでマイコンを制御することができたのですが、割り込みを追加したら、うまくいかなくなりました。 アセンブラを使用せずに、C言語だけでプログラムを完成させたいと思っています。 SCI1からの割り込み処理をするには、どの様にしたらよいのでしょうか? どうか、お願いいたします。

  • H8/3069 SCIについて

    H8/3069のシリアル通信機能についての質問です。 SCI0を調歩同期式に設定して、パソコン上のハイパーターミナルと通信しています。SCI1とSCI2をクロック同期式に設定して、tx1とrx2,tx2とrx1,sck1とsck2を配線接続した状態です。 このとき、PC(ハイパーターミナル)からの送信データ⇒SCI0で受信⇒SCI1から送信⇒SCI2で受信⇒SCI0からパソコンに対してデータ送信したいと思っています。 ところが、SCI1のクロック同期式でのデータ送信がまずできません。データもクロックも出せていないです。 そこで、SCI0,SCI1,SCI2のすべてを調歩同期式に設定した場合は、上記のデータの送受信は成功しています。 H8/3069において、SCI0,SCI1,SCI2のシリアル通信方式の設定を上記のように、1つのH8に対してクロック同期と調歩同期を混在させた場合、何かうまく動作しない原因は考えられますでしょうか。 プログラムでのSCI0とSCI1,SCI2の初期設定の違いは、SCI1とSCI2は、SMRレジスタC/Aビットを1(SCI0は0)にして、SCI2については、SCRレジスタのCKE1ビットを1(SCI0,SCI1は0)にした状態にしています。 よろしくお願いいたします。

  • H8マイコンのシリアル通信について。

    H8マイコンでのシリアル通信についてお聞きしたいことがあります。 現在PCとマイコン(H8/3052F)をRS32Cでシリアル通信ができています。 今回は有線ではなく無線(Bluetooth)を利用してシリアル通信が行いたく、RBT-001というものを購入しました。 そのマニュアルには一番簡単に通信する方法としてPICマイコンとの例が挙げられており、要するに初期設定さえすれば無線を意識せずに使えるとの事だったのですが、どうも出来ていないみたいです。 --------------------私のプログラム---------------------- #include<3052.h> void initSCI1 (void){ int i; SCI1.SCR.BYTE = SCI1.SMR.BYTE = 0;//初期値は0、本文参照 SCI1.BRR = 80; //ビットレート for (i = 0; i <4000; i++) ; //待つ SCI1.SCR.BYTE = 0x30; //受信割り込み許可、送受信許可 SCI1.SSR.BYTE; //ダミーリード SCI1.SSR.BYTE = 0x80; //エラーフラグクリア } //1文字受信 char SCI1_IN_d(void){ //受信文字を返す。 unsigned char c; //受信データの格納変数 while (!(SCI1.SSR.BYTE & 0x78)); //受信またはエラーフラグが立つまで待つ if (SCI1.SSR.BIT.RDRF == 1) { //受信完了なら c = SCI1.RDR; //データを取り出す。 SCI1.SSR.BIT.RDRF = 0; //受信フラグクリア } else { SCI1.SSR.BYTE &= 0x80; //エラーならエラーフラグクリア c = 0; } return c; } //1文字送信 void SCI1_OUT_d(char c) //文字コードを受け取る。 { while (SCI1.SSR.BIT.TDRE == 0); //0でデータあり、1になるまで待つ。 SCI1.TDR = c; //受け取った文字を送信 SCI1.SSR.BIT.TDRE = 0; //TDREビットをクリア } //BLUETOOTH初期設定 void BT_Init(void){ SCI1_OUT_d(0x02); SCI1_OUT_d(0x52); SCI1_OUT_d(0x4E); SCI1_OUT_d(0x01); SCI1_OUT_d(0x00); SCI1_OUT_d(0xA1); SCI1_OUT_d(0x03); SCI1_OUT_d(0x03); return; } int main (void){ unsigned char rd; BT_Init(); initSCI1(); while(1){ rd=SCI1_IN_d(); SCI1_OUT_d(rd); } } ------------------------------------------------------------ 問題はmain文中「initSCI1();」でSCI1を初期化するとズット変な文字化けみたいなのを延々と吐き出して、逆に初期化しないとPCでなんらかのキーを押すとRBT-001は点滅はするけど、文字を返してこないという状況です。 なので「initSCI1();」がおかしいのかと思うのですが、有線では現にこれで出来ているのでなにが原因かわかりません。 良かったらどこがダメでどうするべきか教えてください。 本当に困っています。よろしくお願いします。 通信速度9600bps データ長8ビット長 ストップピット1 パリティ無 CPU最高動作周波数25MHz -------------------RBT-001マニュアルに記載されているサンプルプログラム------------------------- char text; void BT_Init(); void MPU_Init(); int TRISB,ANSEL,ANSELH; int _LCD_FIRST_ROW,_LCD_CURSUR_OFF,_LCD_CLEAR; void main(){ MPU_Init(); BT_Init(); while(1){ if(Uart1_Data_Ready()){ text = Uart1_Read(); Uart1_Write(text); Lcd_Chr_Cp(text); } } } void MPU_Init(){ TRISB = 0; ANSEL = 0; ANSELH = 0; Uart1_init(9600); Lcd_Init(); Lcd_Cmd(_LCD_FIRST_ROW); Lcd_Cmd(_LCD_CURSUR_OFF); Lcd_Cmd(_LCD_CLEAR); return; } void BT_Init(){ Uart1_Write(0x02); Uart1_Write(0x52); Uart1_Write(0x4E); Uart1_Write(0x01); Uart1_Write(0x00); Uart1_Write(0xA1); Uart1_Write(0x03); Uart1_Write(0x03); return; } -------------------------------------------------------------------

  • シリアル通信プログラミングでのバイナリデータ送信

    UNIX系環境(IRIX)でのシリアル通信プログラムを作成していて、 バイナリデータの送信方法がわからず困っています。 write関数を使い、テキストデータの送信は出来ます。 write(fd,"テキスト",byte)のように。 ただ、今回はバイナリデータ送信を考えており、 例えば1byteのデータ00000001(01H)を送りたいと思っています。 このデータを送る場合、write関数で実現出来るのでしょうか? write(fd,0x01,1)←イメージです。 色々ネットで調べても出てきません。 開発がWindows環境ではないので、API関数が使えない状況で困っています(MsComm等が使えない)。また、fwrite関数は使用してはいけないみたいです。教えてください。宜しくお願いします。

  • パソコンを使ってマイコンとシリアル通信

    マイコンでソフトを開発してる組み込み系の技術者です。 例えば、PCからマイコンへ  UART, 9600bps, StopBit=1, LSBファースト、バイナリ通信 で送受信したいです。 PCから送信してマイコンからデータが返信されるのを確認したいです。 単純に送信して受信してだけでなく、 例えば、0x00を受信したら、次の送信を行い、 0x00以外なら再び同じ送信を行うなどのようなことがしたいです。 また、受信してから所定時間後に次の送信を行うなどです。 要するに、受信条件で次の送信をきりわけたいです。 例えば、VB2010だとある特定の数字を受信すると、停止コマンドとみなし、 通信が終了してしまうと聞いたことがあります。 また、VBだともろにソフトを組むことになり、そのソフト作成が大変そうです。 できるだけ簡単な記述で実現させたいです。 説明がうまくできなくてすいません。 ご存知の方、教えてください。

  • H8S 調歩同期通信のデータ送信ができない

    ルネサスのCPU H8S2378 を使用してプログラムを組んでいるのですが、 どうしても調歩同期式通信によるデータの送信が上手く行きません。 自分でマニュアル等を調べているのですが、原因が分からず困っています。 どなたか、アドバイス頂けないでしょうか。 以下に現状の動作とソースを記述致します。 プログラムがスタートすると、 ポート割り込みなどの初期設定を行い、 無限ループに入り、LEDの点滅とデータ'A'の送信を繰り返すことを 意図して記述しました。 しかし、実際にはLEDの点滅、データ送信は行われず、 SCI1.TDR = data; で送信するデータをセットして、 SCI1.SSR.BIT.TDRE = 0x00; で送信フラグのクリアをした後、 送信フラグ(TDRE)がセットされていないようで 2ループ目のwhile( SCI1.SSR.BIT.TDRE == 0x00 );のところで 止まっているようです。 送信動作の確認は、PCに接続してteratermで行ったのですが、 データが入ってきていないようで、オシロスコープでTXD1のポートを当たったのですが、データは全く出力されていないようです。 /*初期化部分*/ void h8_sciinit( void ){  SCI1.SCR.BYTE = 0x00;  /* 内部クロック/SCK*/  SCI1.SMR.BYTE = 0x00;  /* 調歩同期式モード*/              /* データ長:8ビット*/              /* バリティ:なし*/              /* ストップビット:1ビット*/              /* 内部クロック:Φクロック*/  SCI1.BRR = 0x6A;//106  /* ビットレート設定(9600bit/s)*/  for(i = 0;i < 0xFFFF; i++);/*待ち*/  SCI1.SCR.BYTE = 0x30; /* RE,TE->1送受信を許可*/  SCI1.SSR.BYTE; /* ダミーリード*/  SCI1.SSR.BYTE = 0x80; /* エラービットをクリア*/ } /* 送信部分 */ void SCI1_SendData( char data ) { while( SCI1.SSR.BIT.TDRE == 0x00 ); /*未送信データが送られるまで待つ */ SCI1.TDR = data; /* 送信データのセット*/ SCI1.SSR.BIT.TDRE = 0x00; /* 送信フラグのクリア*/ } /* Main関数 */ void Main(void) { GA_Port_init(); //各GAのポートを初期化 INT_INIT(); /* 割り込みの初期設定 */ ipr_register_set(); /* 割り込み優先順位レジスタ 設定 */ DEBUG_LED1 = 0x01; /* デバッグLED設定 */ DEBUG_LED2 = 0x01; /* デバッグLED設定 */ DEBUG_LED3 = 0x00; /* デバッグLED設定 */ DEBUG_LED4 = 0x00; /* デバッグLED設定 */ h8_sciinit(); /* SCI初期設定 */ while(1){  SCI1_SendData( 'A' );  wait();  DEBUG_LED2 = ~DEBUG_LED2 ;  } }

  • H8マイコンに関して

    H8マイコンは、1つのプログラムで複数の周辺機器を同時に使うことができますか? 例えば、LCDとSCI(シリアル通信)を同時に動かしたい。または、AD変換とLCD・SCIを同時に走らす。 とかです。 変数の設定次第で、どうにかなると噂で聞きました。(例えば、グローバル変数を設定するとか?) ご回答をお願いします。

  • シリアル通信について

    VB6にてシリアル通信プログラムを作成しましたが、データが受信できません。 ハイパーターミナルなら受信できて、一度ハイパーターミナルを使用すると、作成したプログラムでもデータが受信できるようになります。(再起動するとまたハイパーターミナルを使用するまで受信できません) 自作プログラムでなにか処理がたりないのでしょうか?