• 締切済み

PICとPC間のシリアル通信について

PICとPC間のシリアル通信について PICの中で数値を処理した結果(たとえば、1516という数値)をstring型でPCにシリアルで送信できますか? PICは8bitまで対応しているので、12345678という数値もstring型で送れるのでしょうか?

みんなの回答

  • waewa
  • ベストアンサー率25% (1/4)
回答No.6

http://www.nicozon.net/player.html?video_id=sm10738650 http://www.nicozon.net/player.html?video_id=sm10819563 http://milky.geocities.jp/waewax/PAGE9.html PIC→PCの一方通行の通信ですがこんな程度でよかったらソフトもハードも簡単に出来ます。 アスキーコードを使って 1010000010などと出力し1文字の送信になります。 はじめの1がスタートビットと呼ばれるものでPCに「今から送るぜ!」と合図を送ります。 次の8ビットがアスキーコードです。 最後の0がストップビットと呼ばれるものでPCに「送り終わったぜ!」と合図を送ります。 これの繰り返しで文字が送れます。 bpsはこの1や0を送信している時間です。 9600bpsの場合これが0.104ミリ秒ということです。 1文字送るのに1.04ミリ秒の時間がかかるわけです。 PIC側もPC側もこのタイミングで信号の受け渡しを期待していますので狂うと文字化けをします。 もっと狂うと文字が受け取れません。逆に言うと文字化けをするときはもう少しで読めると言う事です。 ネット上にいろいろ参考になるサイトがあります。わたしもそこで勉強してこれを作って遊びました。 こんな程度でよければ参考にしてみてください。

  • black2005
  • ベストアンサー率32% (1968/6046)
回答No.5

No.1です。 >8*4=32bitが一回の出力に必要だということになるのでしょうか? 当然、1文字×送信文字数分の出力が必要ですが・・・ 質問の意味が良くわかりません。 >またRS-232ケーブルの種類によって通信速度に影響があるのでしょうか? RS232ケーブルの種類とは何ですか? 具体的にどんな種類? 通信速度はハードウェアの設定値で決まる数値であって、ケーブルの種類なんかには左右されませんよ。

  • hanmemomo
  • ベストアンサー率35% (205/580)
回答No.4

ちょい話はずれますが、 PICは確かに8ビットですが、それは1度に扱える数なので 複数の送信で扱える数には元から限界はないですよ。 2回で一つの値を送れば0~65536(-1)ですし 3回で一つの値を送れば0~16777216(-1)ってことです また、9600にもこだわる必要はないですよ。 PICは結構早いので、38400やそれ以上でも通信してます。 こちらでは、もっと速い速度で通信させてました。 MAX232系のチャージが遅いのでちょっと、無理させましたが チャージとはチャージポンプの意味です。(ここまでは多分触らないとは思いますが) 実際のところ、PICからPCへは超簡単なのですが、逆は死ぬほど面倒 やるとほかの処理が出来ないほどになりますね。

  • black2005
  • ベストアンサー率32% (1968/6046)
回答No.3

訂正 ×よって、周期は960Hzということになりますね。 周波数が960Hz、周期は1/960が正解ですね。

mne34677
質問者

お礼

何度もご回答していただきありがとうございます。 最後にもう一度質問したいのですが、アスキーコードについて調べた結果、1つの文字列が8bitでしたので string count=1516; puts(count) というように出力した場合は、8*4=32bitが一回の出力に必要だということになるのでしょうか? またRS-232ケーブルの種類によって通信速度に影響があるのでしょうか?

  • black2005
  • ベストアンサー率32% (1968/6046)
回答No.2

No.1です。 調歩同期ですよね? であればデータ以外にスタートbit、ストップbitが最低1bitづつ必要。 合計10bitで1文字となります。 よって、周期は960Hzということになりますね。

  • black2005
  • ベストアンサー率32% (1968/6046)
回答No.1

問題なく送れます。 ASCIIコード(キャラクタコードとも呼ばれる)であれば送れます。 http://www40.atwiki.jp/system-ed/pages/11.html

mne34677
質問者

お礼

迅速なご回答ありがとうございます。 もうひとつ質問があるのですが、9600bpsの速度で通信が可能ということは、8bitを一つと考えると、1200Hzの周期で通信可能ということになるのでしょうか?

関連するQ&A

  • PIC同士のシリアル通信について

    PIC初心者なのですが 現在↓サイトでPIC-PIC間のシリアル通信を勉強中です。 http://kuri6005.sakura.ne.jp/pic/index.php?PIC-PIC%A4%CE%C4%CC%BF%AE(USART) その中で通信設定の   Usart_Init(2400); //通信速度を2400 band rateに設定   do {     if(PORTA.F0 == 1) {       Usart_Write('A'); //RA0=1なら'A'を送信     } else {       Usart_Write(0); //RA0=0なら 0 を送信     } の部分でコンパイルエラーがでます。 たぶんヘッダーファイルのようなものが必要で指定されてないからエラーが出るのだとは思いますが、 どこからとってきて?またはどこにあるものなのかがわかりません。 わかる方教えて下さい。 ※テストで使っているPICの種類が違ってPIC16F877Aです

  • PIC-PCシリアル通信プログラム

    PICとPCでRS232のシリアル通信を行おうとしているんですけれど、 PICからPCに文字列を送ろうと たとえば PIC側からプログラムで puts("A\0");とデータを送信して ReadFile()関数でPC側で受信しているんですけれど、 受信したデータを画面表示されると Aフフフフフフフフフフフフフフフフフフフフフフフフと表示されてしまいます。 ちなみに送信データをNULLだけにしても フフフフフフフフフフフフフフフフフフフフフフフフフを表示されます。 これを解決する方法がわかりません。 どなたか教えてください。

  • pic-パソコン間のシリアル通信

    PCからあるいはPICから操作を行って何かやりたいと思い、USART機能を持ったPICを使ってPICとPC間でシリアル通信を行いたいと思っているのですが、回路設計で悩んでいます。 PCのRS232Cシリアルインターフェースとの接続をするために変換回路を作りたいのですが、PIC関連の書籍のほとんどが変換用の専用ICを用いているのですが、なるべく安価な部品(抵抗、ダイオード等)で実現できないか考えています。 PIC→PC への方向の通信 PC→PIC への方向の通信 PIC⇔PC への双方向の通信 以上の3パターンでICを用いないでできる定番の回路、もしくは実現可能だと思われる回路などがありましたら教えていただけないでしょうか。

  • pic 同士のシリアル通信

    picから別のpicにシリアル通信でデータを送ることは可能なのでしょうか? また、出来るとしたらどのようなプログラムになるでしょうか? 上記質問に追記です。 送信側はtxピン、受信側はrxピンという接続で可能でしょうか?

  • PICを用いてシリアル通信

    PIC制御でシリアル通信を行いたいです。 以下の条件にマッチする製品が分かれば教えてくれませんか? ・シリアル通信は通信ポートが2つで両者の通信が行える ・半田付けなどは行わずにモジュールを組み合わせて動作するボード 以上、宜しくお願いします。

  • RS232通信 PIC-PC間

    PICからの数値データをPCにRS232で送信しようと考えているのですが、 putc関数(puts)を用いてitoa関数で数値を文字に変換してから送信しようとしたのですが、 itoa関数の部分でプログラムが止まってしまいました。(たぶん重かったのではないかと思います。) PIC内で重くなく数値を文字に変換する方法か、RS232通信を用いて数値を送る方法があれば教えてください。

  • 離れたPIC同士のシリアル通信の回路でのPICの…

    離れたPIC同士のシリアル通信の回路でのPICの破損について 5m離れた2つのPIC間でシリアル通信(9600bps)をする回路を作りました。 単にそれぞれのPICの内蔵モジュールのTXとRXをたすきがけしただけの回路です。 また、メインの電源は12Vで、それぞれのPICの近くにそれぞれ専用の7805を配置してPICに5Vを供給しています。 また、2つのPIC間のケーブルはコネクターで取り外せるようになっており、同ケーブルにはシリアル通信(送信、受信)、+12V、GNDの計4本の線で構成されています。 この状態で特に問題無く通信はできているのですが、ふとしたことでPICの内蔵モジュールが破損することがあります。 同じ回路を2セット作りましたが、同様に破損してしまいました。 多分、コネクタを抜き差しするか、或は電源を投入、切断のタイミングではないかと予測しています。 (詳しくは、参考URLの図をご覧ください。  図には電源のコンデンサなどは記載していませんが、それぞれ適宜、配置してあります。) 尚、2つのPIC付近の7805には、PIC以外にそれぞれ違う消費電流の負荷が接続されています。 そのため、5Vに安定するまでの時間に違いが出てしまい、結果、内蔵モジュールの規格外の電圧がかかってしまうのかと予測しています。 ここで質問です。 ・このような状況の場合、PICが破損する原因はどのようなことが考えられるでしょうか? ・解決策はどうしたら宜しいでしょうか? まだ試していませんが、MIDIのようにフォトカプラを使用するか、RS-232Cトランシーバを使用するか等を考えておりますが、なるべく簡易で確実な方法をとりたいです。 宜しくお願いいたします。 http://box.c.yimg.jp/res/box-s-vboqi4x6dy2zfrx7fyns5aqghq-1001?uid=5c9c0a84-d898-45e4-8d4b-df319ca25f24&etag=5c2f1b99137520886935391

  • PICのシリアル通信のWIN_APIプログラムについて

    PICとPCとのシリアル通信の WIN_APIプログラムについてどなたかご存知の方は教えてください. 現状,API関数を用いて,シリアル通信をできるようにプログラムを作成したのですが,送信はできるのですが,受信データが"C0"をPICから送付しているのに,"FFFFFFFC0"と受信されてしまいます. 先の"FFFFFFF"をとるにはどうしたらいいでしょうか? 現状:受信プログラム // シリアルポートに対する書き込み(PICに送信命令) WriteFile(hCom, w_com_Buf,lstrlen(w_com_Buf), &n, 0 ); // シリアルポートに対する読み込み ReadFile(hCom, s_com_Buf,1, &n, 0 ); mikroC上のUSARTターミナルでは送受信は適正で, 上記のプログラマで 送信はPIC側で受信していることは7SEGを使って確認しています. しかし,PC側では, s_com_Buf[0]には,"C0"が入ったり,"FFFFFFC0"が入ったりします. PICは現状,多チャンネルAD変換をしているため, 送信に対する受信データのやり取りができなくて困っています. どなたか先生教えてください.

  • PICとPCでのシリアル通信

    PICとPC間でのシリアル通信を行ってるんですけどうまくいきません。ハイパーターミナル使えばうまくいくんでPIC側のソース(C)はうまくいってると思います。ハイパーターミナルを使わずにシリアルの送受信のプログラム(C++)を組んでるんですけどうまくいかなくて。。。 アドバイスなどお願いします!!どこが違うんでしょうか。。。 ●PC側のソース(C++) #include "stdafx.h" #include <stdlib.h> #include <windows.h> #include<iostream> using namespace std; #define COM_PORT_NAME "COM1" #define BAUD_RATE 9600 #define BYTE_SIZE 8 #define PARITY EVENPARITY #define STOP_BIT TRUE #define F_PARITY ONESTOPBIT HANDLE hComm; // シリアルポートとの通信ハンドル bool ComInit() { // シリアルポートを開ける hComm = CreateFile( COM_PORT_NAME, /* シリアルポートの文字列 */ GENERIC_READ | GENERIC_WRITE, /* アクセスモード:読み書き */ 0, /* 共有モード:他からはアクセス不可 */ NULL, /* セキュリティ属性:ハンドル継承せず */ OPEN_EXISTING, /* 作成フラグ: */ FILE_ATTRIBUTE_NORMAL, /* 属性: */ NULL /* テンプレートのハンドル: */ ); if (hComm == INVALID_HANDLE_VALUE) { printf("シリアルポートを開くことが出来ませんでした。\n"); return false; } // 通信属性を設定する DCB dcb; GetCommState(hComm, &dcb); /* DCB を取得 */ dcb.BaudRate = BAUD_RATE; dcb.ByteSize = BYTE_SIZE; dcb.Parity = PARITY; dcb.fParity = STOP_BIT; dcb.StopBits = F_PARITY; SetCommState(hComm, &dcb); /* DCB を設定 */ return true; } void ComEnd() { // ハンドルを閉じる CloseHandle(hComm); } bool WriteData(char *buff, unsigned int data_size) { DWORD dwWritten; /* ポートへ書き込んだバイト数 */ WriteFile(hComm, buff, data_size, &dwWritten, NULL); if (dwWritten!=data_size) { printf("データの送信に失敗しました。\n"); return false; } return true; } bool ReadData(char *buff, unsigned int max_size) { DWORD dwErrors; /* エラー情報 */ COMSTAT ComStat; /* デバイスの状態 */ DWORD dwCount; /* 受信データのバイト数 */ DWORD dwRead; /* ポートから読み出したバイト数 */ ClearCommError(hComm, &dwErrors, &ComStat); dwCount = ComStat.cbInQue; if (dwCount > max_size) { printf("バッファサイズが足りません。\n"); return false; } ReadFile(hComm, buff, dwCount, &dwRead, NULL); if (dwCount != dwRead) { printf("データの受け取りに失敗しました。\n"); return false; } return true; } int main(int argc, char* argv[]) { char ch; while(1){ cin >> ch; printf("入力 %c\n", ch); ComInit(); WriteData(&ch, strlen(&ch)); ReadData(&ch, strlen(&ch)); ComEnd(); } return 0; }

  • PIC間の通信について

    12ビットのAD変換を1つのPIC(PIC16C771)で行い、 その変換後の値をもう1つのPICで処理したいのですが、PIC同士ではどのような通信を行えばよいのでしょうか? よろしくお願いします。

専門家に質問してみよう