• 締切済み

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

salsberryの回答

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.3

まずはPC側のソフトウェアを実績のあるものにしてPIC側をデバッグすべしというANo.2さんの回答に一票。 あと、基本の基本ですがRS-232Cの通信パラメータはPIC側とPC側で合わせてありますか?

関連するQ&A

  • 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変換をしているため, 送信に対する受信データのやり取りができなくて困っています. どなたか先生教えてください.

  • RS232通信 PIC-PC間

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

  • C++のプログラムについて

    readfile関数を使用してPICからPCへデータを送信しようとしているのですけれど、 通信開始してからPICからのデータを変化させても受信データが変化しません。 なぜでしょうか。解決方法もおしえてください。 ちなみにPICの信号がちゃんと変わっているかはcheck済みです。 PC側プログラム if(key=='G'){ ReadFile( comHandle, &data_a, 1, &lRead, NULL ); printf("%c\n",data_a); } キーボードで'G'を入力すると受信するようにしてあり PIC側では最初'A'を出力していて、 'G'を押すとprintfで'A'を表示しますが、PIC側の信号を'B'に変化させて 'G'を押しても'B'と表示されずに'A'と表示されてしまいます。

  • pic 同士のシリアル通信

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

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

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

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

    現在PICで電子工作を勉強中です。 PIC16f628Aを使ってパソコンとのシリアル通信をしようと思っています。 しかし、PICから"Hit some key for test"という文字列をおくったところ、 文字化けして"ソ3!・ソ)5"といった感じで出力されてしまいました。 文字化けが起きる原因としては何が考えられるのでしょうか? なお、パソコン側の端末にはTera Termを使用しています。 どなたかご教授お願いします。 以下にソースコードを示します。 #include <pic.h> __CONFIG(MCLRDIS & PWRTEN & BORDIS & UNPROTECT & WDTDIS & LVPDIS & HS); __IDLOC(628A); unsigned char getchr(void) { while(RCIF == 0); return (RCREG); } void putchr(unsigned char c) { while(TXIF == 0); TXREG = c; } void puts(const unsigned char *s) { while(*s) putchr(*s++); } void main(void) { PORTB = 0; TRISB = 0b00000010; SPBRG = 129; TXSTA = 0b00100100; RCSTA = 0b10010000; puts("Hit some key for test\n"); puts("\n"); while(1) putchr(getchr()); }

  • 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-パソコン間のシリアル通信

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

  • 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です

  • RS232C通信について

    PC-マイコン間の通信において マイコンから信号を受信するために ReadFile関数の第3引数を受信文字バイト数にしたところ, PC側のプログラムでReadFile関数を実行するごとに 受信文字が1バイトずつ右にずれるような受信をし始めました. 1ループ→"abcd" 2ループ→"dabc" 3ループ→"cdab" こちら側の意図としては ReadFile関数を一度実行すると, ReadFile関数の第2引数に上書きされるものだと思っていたのですが, 具体的にはどのように文字が格納されていくのでしょうか? また,あわせてWriteFile関数で文字列をマイコンに送信しているのですが, 上述の文字列と合体した状態で受信してしまいます. 具体的には char c[17]="abcdefghijklmnop"; char p[13]="100100100100"; ハンドルの指定 ループ始め ・・・ ReadFile (hCom, c, strlen(c), &dwRead, NULL); WriteFile (hCom, p, strlen(p), &wbyte, NULL); ・・・ ループ終わり ハンドルクローズ と記述しています. 仮にマイコン側から"abcdefghijklmnop"が送られてきた場合 cには 1ループ→"100100100100abcd" 2ループ→"100100100100pabc" です. どこに課題があるでしょうか よろしくお願いします.