• ベストアンサー

マイコン同士をsciを使ってシリアル通信をしたいと考えています。

マイコン同士をsciを使ってシリアル通信をしたいと考えています。 単純に マイコン1側 マイコン2側 RXD<->TXD TXD<->RXD GND<->GND を接続すれば通信できると考えたのですが、上手くデータを送ることが出来ません。 どうすれば通信できるでしょうか? また、参考になる書籍・WEBサイトをご紹介して頂ければ幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • anicicle
  • ベストアンサー率36% (129/356)
回答No.2

>を接続すれば通信できると考えたのですが、上手くデータを送ることが出来ません。 それで、接続形態は「同期」? それとも「非同期」? >どうすれば通信できるでしょうか? 同期ならボーレートはあってる? スタート/ストップビットの方式は? 受信データのデータ長はあってる? チェックサムは? そもそも、両方のマイコンは同じ通信モードに対応してるの? >また、参考になる書籍・WEBサイトをご紹介して頂ければ幸いです。 「SCI」っていうのは「シリアルで通信します」という総称でしかないので、その先は仕様により全く違う。「RS-232」も広義ではSCIの一つ。 上記で書いたようなことを片っ端から片付けるしかない。 ちなみに「繋いだだけ」では大抵のものは通信しない。 「通信するプログラムを組み込む(通信設定を行う)」ことで通信するわけだけど……そのあたりの理解は大丈夫?

fallen4487
質問者

お礼

ありがとうございました。理解しました。

その他の回答 (2)

  • kaoaru
  • ベストアンサー率33% (42/127)
回答No.3

使っているマイコンは何ですか? PICとかAVRとか現在流通しているマイコンでしたらメーカーのアプリケーションマニュアルを参照されたほうがいいんじゃないでしょうか? 一言に「シリアル通信」といってもハンドシェイクが必要なのかどうか?同期式なのかどうか?もっと細かい情報を提示しないと答えようがありません。 もしかすると、単にSCIと呼んでいる部分の設定がおかしいのだけかもしれませんが、それすらないわけですから、なんとも答えようの無い質問です。 ワンチップマイコンはピンの選択機能が正しく設定されてないと動作しないハズです。そこらへんも確認されたのですか?

fallen4487
質問者

お礼

ありがとうございました。理解しました。

  • foitec
  • ベストアンサー率43% (1079/2453)
回答No.1

シリアル通信なので割り込みを遣うか遣わないかにかかわらず キャリア検出・送信リクエスト・受信準備完了・同期(ハンドシェーク)などの信号も必要では? EIA232(RS232C)の解説ならば以下を参考に http://www.cqpub.co.jp/hanbai/books/18/18791/18791_P53-55.pdf

fallen4487
質問者

お礼

ありがとうございました。理解しました。

関連するQ&A

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

    マイコンでシリアル通信を用いてセンサのデータを取得したいのですが、このセンサのシリアル通信の設定がストップビット2、奇数パリティとマイコンでシリアル通信をするのにやっかいな設定となっています。また取得したセンサデータをシリアル通信を用いてPCに送りたいと考えているのでマイコンのシリアルは2ch必要です。私もいろいろ探しているのですが、なかなか条件を満たすマイコン(ストップビット2対応、シリアル2ch、A/D2ch)が見つかりません。どなたか情報ありましたら教えてください。よろしくお願いします。できればDIPタイプのマイコンを探しています。

  • GPIOポートを使ったシリアル通信について

    GPIOポート(デジタルの汎用入出力)を用いてのシリアル通信について質問させて頂きます。 通常シリアル通信にはTxD,RxDといったシリアル通信用のピンを用いますが、これは通常1デバイスに一ポート程度しかありません。そこで、多数のシリアル通信デバイスを制御するのに、数のあるGPIOピンを用いることができないか、と検討しております。 具体的には、raspberry piやarduinoに搭載されるGPIOピンと制御したいデバイス(PICマイコンなど)のシリアル通信ポートを接続し、制御したいということです。 説明が下手で意図がうまく伝わらないと思いますが、できるかできないか、または参考になる資料など、なんでもいいので情報の提供をよろしくお願いいたします。 イメージしている接続を図示してみましたので、説明の足しになれば幸いです。

  • H8マイコンとPCをUSBでシリアル通信

    H8マイコンとPCをUSBでシリアル通信 マイコン( H8/2215 )をUSBでPCと繋ぎ、RAM上にあるデータを シリアル通信で送りたいと思っています。 現在、書籍のサンプルソースを参考に図1のような構成で プログラムを実行すれば H8/2215 から PC_1 へデータが送れる ことを確認しました。 しかし、図2の構成で実行するとデータが送れません。 また、PCとは繋がず RS232C のケーブルだけをマイコンにさせば なぜか問題なく動作します。 このような状態なので、プログラムを試行錯誤しながら調整 しているのですがなかなかうまく通信出来ません。 図2のような構成でシリアル通信したい場合、どこをどんな風に 調整すれば良いのでしょうか? 参考URLでも何でも構いませんのでアドバイスお願いします。 図1  PC_1 <--- USB ---> H8/2215 <--- RS232C ---> PC_2 図2  PC_1 <--- USB ---> H8/2215 <サンプルソースの書籍> 「USBターゲット機器開発のすべて」(CQ出版社)  サンプルソースはルネサスのH8S/2215用USB-シリアル  変換サンプル・プログラム

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

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

  • DTCを用いたSCI通信について質問があります。

    DTCを用いたSCI通信について質問があります。 下記の点についてご教示ください。 SH7145マイコンを使って、DTCを用いたSCIシリアル通信を 行っております。 DTC(ノーマルモード)の設定でDTCRAに7バイト設定し、送信 を行うと6バイトしか送信されません。 TDRを確認しますと7バイト目がセットされています。 これは7バイト目が送信されていないということでしょうか? その場合、DTCRAには、送信したいバイト数+1を設定するのでしょうか? また、送信データの最終バイトが0xFEの場合があります。 この場合は、どういうときに起きるのでしょうか? 以上、よろしくお願いいたします。

  • 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; } -------------------------------------------------------------------

  • C#とマイコンでSCI通信

    マイコンとC#で仮想COMポートを使ってSCI通信しているんですが、 ・「マイコン⇒C#」でデータを受信するときは、  正常に受信でき、 「C#⇒マイコン」がデータを受信するときは    正常に受信できません。 ・C#から何を送っても0x0aの値しかマイコンが受け取りません。 (TeraTermからは正常な値を受け取っています) 以上の点から、C#の送信プログラムの中身が悪いと思うのですが、 C#は初めて手をつけたのでよくわかりません。 送信にはWriteLine()関数を使っています serialPort1.WriteLine("a"); このような感じで一文字一文字送り、マイコンでLCDに表示させ結果を見ています。 シリアルポートの設定は次のように行っています try { beginTime = DateTime.Now; //←プログラムの関係上いれてるだけです this.serialPort1.PortName = this.textBox2.Text; this.serialPort1.BaudRate = 9600; this.serialPort1.Parity = System.IO.Ports.Parity.None; this.serialPort1.DataBits = 8; this.serialPort1.StopBits = System.IO.Ports.StopBits.One; serialPort1.Open(); serialPort1.DtrEnable = true; serialPort1.RtsEnable = true; } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } COMポートに関してはFormに別途ボタンを作りそこから選択するようにしています。 どこが悪いのか概要だけでも教えてほしいください;; よろしくおねがいしますm(__)m

  • シリアル通信波形のなまり

    2つのマイコン間のシリアルデータラインを測定すると、"H","L"を繰り返している時は正常に矩形波になっているのですが、"H","L"が一旦止まった直後に垂直に"L"に落ちるところが、時定数を持っているかのように、ゆっくり"L"に落ちる波形になっていました。 マイコン間には対GNDにコンデンサがいるわけでもなく、ダンピング抵抗がシリーズにいるだけで、原因がわからないのですが、考えられることは何があるのでしょうか? 見にくいですが、下記のような波形です。    __ ___ ____   | | | | | \ __| |___| |___|   \____ なまって"L"へ落ち切る前に、次の通信が始まると下記のように途中でまた"H"になります。    __ ___ ____ ____ ____   | | | | | \ | | | | | | | | |   \ | | | | | | | | |   \| | | | __| |___| |___|   |___| |__ CMOSなので、Hi-Zになり浮遊容量などとでなまってるのでしょうか? シリアルはクロック、データI/O、CEの四本です。

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

    以下のようなハード環境とプログラムで、マイコンの変数値をPCへ取り込む環境(データロガー)を実現しております。ただし、更にデータの取り込み速度を向上させたく考えておりますが、その手段として、”バイナリー形式”での通信が適用できると情報を得ておりますが、具体的な手法が不明です。よろしくご教授をお願いします。 <環境> ・H8マイコン ・RS-232CでPCと接続 ・PCでのデータ取得は、ハイパーターミナルを利用 <プログラム> (1)送信する部分 H8のSCI3を利用して、1文字ずつ送信 以下具体的に作成したプログラムです void sci3_tx(char data){ while (SCI3.SSR.BIT.TDRE==0); SCI3.TDR=data; } (2)実際の送信 "1234"(←千二百三十四)と"3456"(←三千四百五十六)というデータを連続して送信したい場合には、 sci3_tx(1+48); sci3_tx(2+48); sci3_tx(3+48); sci3_tx(4+48); sci3_tx('\r'); sci3_tx('\n'); sci3_tx(3+48); sci3_tx(4+48); sci3_tx(5+48); sci3_tx(6+48); sci3_tx('\r'); sci3_tx('\n'); と処理し、ハイパーターミナルでデータを保存して、"1234"と"3456"を取り出しています。 <ご質問の詳細> (1) 上記のように2つの数値をバイナリー形式で送信するためには、どのように実施したらよいのでしょうか? 例えば、バイナリーの場合2の8乗であるので、 1234を送信する場合、255+255+255+255+214で、11111111、11111111、11111111、11111111、 11010110と送信して、加算処理をすればよろしいでしょうか? (→255を11111111と送信するプログラムもいまいち不明ですが) (2)バイナリー形式で送信する際の送信始め/終わりの区切りはどのように考えたらよろしいでしょうか? (3)バイナリー形式を受信できるソフト(ハイパーターミナルに対応するもの)は、何になりますでしょうか? 以上、いくつかのご質問をさせていただきましたが、参考となる情報(Web、書籍)がありましたら、合せてご紹介をお願いいたします。

  • Win AVRでのシリアル通信

    Win AVRにてAtmega8をC++にてコントロールしたいと思っていますが、訳ありまして、TXDポートからシリアル通信をせずに、ほかのポート(具体的にはPort B4)を使ってシリアル通信をしたいと思っています。しかし、私が見たどのサイトでもTXDのシリアルポートから出力したソースしか見つかりませんでした。 すみませんが、どなたか、シリアル通信を任意のポートで行う方法があればご教授願いたいと思います。または、参考になるサイトを教えてください。よろしくお願いします。