• 締切済み

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

みんなの回答

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.1

>>ハイパーターミナルを使わずにシリアルの送受信のプログラム(C++)を組んでるんですけどうまくいかなくて。。。 よくある、「悪い質問の仕方」ですね。全然通信もはじまらない、はなからダメなのか、それとも、ちょっと通信ができて、あとが続かないのか、「うまくいかなくて」の状況説明が必要だと思いますが。 >>アドバイスなどお願いします!!どこが違うんでしょうか。。。 シリアルの送受信を、きちんと動作するように作りこむのは、結構大変です。Windows以前のDOSのころには、それが大変なので、「C言語用シリアル通信ライブラリ」「VisualBasic用シリアル通信ライブラリ」っていうのが、それなりの価格で販売されていました。ハイパーターミナルは、通信プログラムを作成した経験のある人は当然知っているけど、そうでない人は全然考慮していない処理、いわゆる「シリアル通信のノウハウ」ってのをきちんとやっているから、うまくいくのでしょう。 私は、UnixやDos上では、シリアル通信のプログラムを作っていましたけど、Windows+C++環境では、作成経験がないので、この程度しか書けませんが。 と、ここまで書いて、プログラムをよくみると「シリアル通信のお勉強」っていうような単純なものですね。 >>char ch; と定義しながら、 >>strlen(&ch) はダメでしょう。strlenはNULLターミネータの文字列を期待していますから。 また、 cin>>ってC++風に記述しながら、printfを使うのも、変ですね。 ってことで、がんばってください。

専門家に質問してみよう