dポイントプレゼントキャンペーン実施中!

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_RATE9600
#define BYTE_SIZE8
#define PARITYEVENPARITY
#define STOP_BITTRUE
#define F_PARITYONESTOPBIT

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;

}

A 回答 (1件)

>>ハイパーターミナルを使わずにシリアルの送受信のプログラム(C++)を組んでるんですけどうまくいかなくて。

。。

よくある、「悪い質問の仕方」ですね。全然通信もはじまらない、はなからダメなのか、それとも、ちょっと通信ができて、あとが続かないのか、「うまくいかなくて」の状況説明が必要だと思いますが。

>>アドバイスなどお願いします!!どこが違うんでしょうか。。。

シリアルの送受信を、きちんと動作するように作りこむのは、結構大変です。Windows以前のDOSのころには、それが大変なので、「C言語用シリアル通信ライブラリ」「VisualBasic用シリアル通信ライブラリ」っていうのが、それなりの価格で販売されていました。ハイパーターミナルは、通信プログラムを作成した経験のある人は当然知っているけど、そうでない人は全然考慮していない処理、いわゆる「シリアル通信のノウハウ」ってのをきちんとやっているから、うまくいくのでしょう。
私は、UnixやDos上では、シリアル通信のプログラムを作っていましたけど、Windows+C++環境では、作成経験がないので、この程度しか書けませんが。



と、ここまで書いて、プログラムをよくみると「シリアル通信のお勉強」っていうような単純なものですね。

>>char ch;

と定義しながら、

>>strlen(&ch)

はダメでしょう。strlenはNULLターミネータの文字列を期待していますから。

また、

cin>>ってC++風に記述しながら、printfを使うのも、変ですね。

ってことで、がんばってください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!