• ベストアンサー

データ受信ができません

現在、Turbo C++を用いてソフトを作っています。WinAPI関数を用いて、RS232Cによって電子回路とPC間でシリアル通信を行っています。デスクトップのパソコンでは通信はうまくできていたのですが、ノートパソコンに、USBとRS232Cの変換ケーブルを用いて同じプログラムを動かしたところ、データ受信が全くされません。CreateFile関数はエラーは出ませんが、ReadFile関数などは受信されずに待機しているような状況です。コムポートの設定も問題はないと思うのですが、他に何か問題はあるでしょうか。 予想できる範囲でわかる方お願いします。

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

  • ベストアンサー
noname#144013
noname#144013
回答No.2

こんにちは。 ハードウェアフロー制御(CTS/RTS)に起因する障害であれば、WinAPI の SetCommState関数 を使用してハードウェアフロー制御を無効とするような設定にした方が良いかもしれません。 具体的には、SetCommState関数 に渡す DCB構造体 の下記メンバあたりを上手く調整して、 何度か試験してみると良いかもしれません。   DWORD fOutxCtsFlow :1;      //CTS入力信号監視 有効/無効→ハードウェアCTSフロー制御の有無   DWORD fOutxDsrFlow :1;      //DSR入力信号監視 有効/無効→ハードウェアDSRフロー制御の有無   DWORD fDtrControl :2;       //DTR制御方式の指定   DWORD fDsrSensitivity :1;     //DSRの状態に対する感度設定   DWORD fTXContinueOnXoff :1;  //通信相手の受信バッファーがFULL状態でXoffCharが送られて                        //きた時の送信継続/中止設定(ソフトウェアフロー制御時)   DWORD fOutX :1;          // 送信のソフトウェアフロー制御設定 有効/無効   DWORD fInX :1;           // 受信のソフトウェアフロー制御設定 有効/無効   DWORD fRtsControl :2;      //RTS出力信号制御 有/無 及び 制御方式設定 シリアル通信関連の WinAPI に関しては、下記サイトが参考になるかもしれません。 ■参考サイト ◎RS232C シリアル通信 http://www.ys-labo.com/BCB/2007/070512%20RS232C%20zenpan.html ◎Win32API 関数&構造体一覧 http://www.ys-labo.com/pc/2007/070519%20COM%20Function%20Structure.html ◎RS232C通信 (PC - PIC間) http://www.ys-labo.com/pic/pic%20chips/pic%20chips%20contets/2007/070401%20RS232C%20PC_PIC.html ・このページに、C++ Buider Ver.6 + WinAPI を使用したサンプルプログラムが掲載されています。

aoisango
質問者

お礼

フロー制御を無効にし、何とか通信できるようになりました。 ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

デスクトップでUSB-RS232Cケーブルを使用した場合はどうなりますか? おそらくノートと同じ状態になるのではないかと推測しますが。 USB-RS232ケーブルは、シリアルポートの制御を「ある程度」エミュレートしているだけで、DTRやCTSについてはデバイス(に付帯するドライバー)任せです。 その為、CTS等の制御を行っている場合には正常に動作しない場合があります。

aoisango
質問者

補足

デスクトップのパソコンでケーブルを用いて試してみたところ、おっしゃる通りで、データ受信は行えませんでした。 対処法はないのでしょうか。。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • GPSデータ(NMEA)受信

    USB接続のGPS受信機の購入を検討中で、 GPS受信機よりNMEAデータのUTCを取得したいと考えています、 NMEAデータ取得の方法について教えてください。 プログラム上(VB.net,C#)より RS232CのようにUSBのポートに接続し、 ボーレートを設定して受信すればよいのでしょうか? NMEAデータがRS232Cシリアル通信のように垂れ流されてくるイメージなのですが、 問題ないでしょうか?

  • HIDでReadFileのタイムアウトを設定したい

    PCとUSB接続したHIDデバイスと通信するのに、CreateFileからWriteFile/ReadFileを使用しています。 VID、PIDを頼りに、通信自体は問題なくできています。 ただし、デバイス側のモード切替で、通信モードに入っていないときに問題が発生します。 WriteFileのほうはデバイスがつながってさえいれば送信だけはできるので一応問題ないのですが、ReadFileのほうはデバイスが通信モードに入っていないときでもデバイスからの受信待ちを続けて処理がストップしてしまいます。 SetCommTimeoutsでタイムアウトの設定をできないかとやってみたのですが、「ファンクションが違います」というエラーがでるばかりでなんともなりません。 こいつはシリアル通信のときにしか使えないのでしょうか。 HIDデバイスとの通信でタイムアウトを設定する方法はないものでしょうか? あるいは受信待ちでストップしないよい方法はないでしょうか?

  • シリアル通信のイベント受信について

    現在VB6.0を使用してシリアル通信のプログラムを MsCommを使用せず、CreateFileを使用して行っておりますが、 データの受信を受信したタイミングでテキストボックスに表示したいのですが どの様にすると受信したタイミングでデータを取得できるのかわからず困っております。

  • WinAPIでCのfgetsのようにファイルから1行ずつ読み混むには?

    WinAPIでCのfgetsのようにファイルから1行ずつ読み混むには? ReadFileで読み込んだあとfgetsの代わりになる関数または どのようなシステムを作れば1行ずつ読み込めるでしょうか 教えて下さい。

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

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

  • シリアル通信の受信待ちについて

    シリアル通信で10Byte受信するまで待ち続けたいのですが、0ByteでReadFileが抜けてしまいます。 ReadFileの最後のパラメタが、NULLならば第3パラメタの値まで待ち続けると思っていたのですが、なにか設定が足りないのでしょうか? タイムアウト値は0にしています。(色々変えて見ましたが同じでした) HANDLE hComm; /* シリアルポートのハンドル */ DCB dcb; char* pszBuf="1234567890"; /* 書込・読込領域 */ hComm = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); GetCommState(hComm, &dcb); /* DCB を取得 */ dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; dcb.ReadIntervalTimeout = 100; dcb.ReadTotalTimeoutMultiplier = 0; dcb.ReadTotalTimeoutConstant = 0; dcb.WriteTotalTimeoutMultiplier = 10; dcb.WriteTotalTimeoutConstant = 500; SetCommState(hComm, &dcb); /* DCB を設定 */ DWORD dwRead; /* ポートから読み出したバイト数 */ ReadFile(hComm, pszBuf, 10, &dwRead, NULL);

  • 非同期のプロセス間通信(パイプ)で全データ受信する

    こんにちは。 非同期のプロセス間通信(パイプ)で詰まっています。 環境はWindowsで処理系はC++(Win32)です。 スレッドを用意して、 hPipe = ::CreateFile( L"\\\\.\\pipe\\pipename", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL ) ; で作成し、OVERLAPPED構造体を // ZeroMemory( &so, sizeof( OVERLAPPED )) ; sOverlapped.hEvent = ::CreateEvent( NULL, FALSE, FALSE, NULL ) ; として、 const size_t bufsize = 16 ; BYTE     buffer[ uBufSize ] ; DWORD    dwNumberOfBytesRead ; bRet = ::ReadFile( hPipe, buffer, bufsize, &dwNumberOfBytesRead, &so ) ; で読み込みをしています。ReadFile関数はすぐ戻りbRetはFALSEで返ってくるため、GetLastErrorを調べて、 switch( ::GetLastError()) {   case ERROR_IO_PENDING :     bRet = ::GetOverlappedResult( hPipe, &so, &dwNumberOfBytesRead, FALSE ) ;     break ; } としてWaitForMultipleObjectsでsOverlapped.hEventがシグナル状態になったら取得したデータの処理をしています。 シグナル状態になるならないに関わらず、上記のReadFileとGetOverlappedResultはループでぐるぐる回しています。 上記の状態で短いデータならよかったのですが、上記のReadFileで読み込み最大サイズの16バイトを超えてしまとうと、 残りの部分のみしか取得できませんでした。 0123456789ABCDEFabcdefg というデータを受信しようとしたとき、後半のabcdefgだけしか取得できませんでした。 すべてのデータを正しく取得するにはどのようにしたらよいのでしょうか?

  • COMポートに流れるデータを監視する方法について

    ComPortキャプチャのような COMポート(シリアルポート)を経由してやりとりされる送受信データをキャプチャするツールを作成しようとしております。 言語は、C言語でBCCdeveloperの環境で 作成しております。 WIN32APIの下記の関数でなんとか 送受信できるツールは、できました。 CreateFile GetCommState ClearCommError WriteFile ReadFile ひとつのツールでポートをオープンすると 別のソフトからはオープンできないようなので、 なんとかして、他のソフトが送受信しているデータを キャプチャできる方法ありましたらご教授願います。

  • シリアル通信のデータ欠けについて

    シリアル通信のデータ欠けについて教えてください。 WindowsXP上でシリアル通信「115200bps、8、None(ODD、EVEN)、1」の設定で、1ms毎に12バイトの送受信を行っているのですが、1分ほど受信すると、データ欠けが発生します。 受信プログラムはこの問題が発覚してから、受信したデータを変数にバッファリングし、保存ボタンを押してから、ログファイルへ保存するシンプルなプログラムを作成し、確認しています。 「切り分けた内容」 1、57600bpsでも発生する 2、VB6、VisualStudio2008 C#で作成したツール及びフリーソフト(SerialDebugger)でも、データ欠けが発生する 3、RS232Cラインモニタ(キャロちゃん)で確認すると、データ欠けは発生していないので、受信側の問題と判断しています。 4、送信間隔を50msと遅くしても発生する 5、RS232C及び、USB変換したものどちらでも発生する 6、9600bpsでは、発生しない(同じデータ数での判断) 7、ケーブル長は1mほど ちなみに通信時間に余裕が無い為、チェックサムやハンドシェイクなどの機能は、入れられません。 一般的にWindowsでシリアルの高速受信を行うと、データ欠けが発生するのが当たり前なのでしょうか?

  • 無手順プロトコルによるデータ交信について

    三菱のシリアルコミュニケーションユニット QJ71C24Nとオムロンの電力調整器 G3PW-A245EC-C-FLKをオムロンの汎用シリアル通信CompoWay/Fで通信しています。(RS-485で接続) 電力調整器の出力量を受信してタッチパネル上に表示させたいのですが、ラダープログラムはどのように組めばいいのでしょうか。