![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
>>ハイパーターミナルを使わずにシリアルの送受信のプログラム(C++)を組んでるんですけどうまくいかなくて。
。。よくある、「悪い質問の仕方」ですね。全然通信もはじまらない、はなからダメなのか、それとも、ちょっと通信ができて、あとが続かないのか、「うまくいかなくて」の状況説明が必要だと思いますが。
>>アドバイスなどお願いします!!どこが違うんでしょうか。。。
シリアルの送受信を、きちんと動作するように作りこむのは、結構大変です。Windows以前のDOSのころには、それが大変なので、「C言語用シリアル通信ライブラリ」「VisualBasic用シリアル通信ライブラリ」っていうのが、それなりの価格で販売されていました。ハイパーターミナルは、通信プログラムを作成した経験のある人は当然知っているけど、そうでない人は全然考慮していない処理、いわゆる「シリアル通信のノウハウ」ってのをきちんとやっているから、うまくいくのでしょう。
私は、UnixやDos上では、シリアル通信のプログラムを作っていましたけど、Windows+C++環境では、作成経験がないので、この程度しか書けませんが。
と、ここまで書いて、プログラムをよくみると「シリアル通信のお勉強」っていうような単純なものですね。
>>char ch;
と定義しながら、
>>strlen(&ch)
はダメでしょう。strlenはNULLターミネータの文字列を期待していますから。
また、
cin>>ってC++風に記述しながら、printfを使うのも、変ですね。
ってことで、がんばってください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語で複数列のデータを1列の...
-
Enterキーを押されたら次の処理...
-
【C言語】全角文字の配列を、全...
-
構造体メンバの初期化
-
fatal error LNK1120: 外部参照...
-
タイムカードのシステムを作り...
-
プログラミング 難問
-
#defineが使用するメモリ領域に...
-
いつもお世話になっております...
-
マイナスからプラスへ転じた時...
-
信頼区間の1.96や1.65ってどこ...
-
「Aに対するBの割合」と「Aに対...
-
AtCoderABC135の問題Cについて
-
Aの値からBの値を除するとは??
-
C言語での引数の省略方法
-
プログラミング初心者です。 Py...
-
doubleの変数にintとintの割り...
-
「指定されたキャストは有効で...
-
エクセルで可視セルにのみ値貼...
-
C言語で電卓を作成する。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
C言語で複数列のデータを1列の...
-
#defineが使用するメモリ領域に...
-
printf による16進表示について
-
空白を含んだ文字列がうまく格...
-
【C言語】全角文字の配列を、全...
-
reallocでエラー
-
C言語のプログラムで、途中で止...
-
構造体メンバの初期化
-
char型2つを結合し、short型に...
-
C言語でのCSVファイルの読み出...
-
エラーについて質問です。
-
Cでファイルの行数をカウントす...
-
矢印キーを押下してコンソール...
-
終了条件Ctrl+zについて,結果表...
-
受信データから必要な部分のみ...
-
リストの作成と出力(C言語)
-
大量のファイルを読み込み、そ...
-
Ç言語でファイルサイズを変更す...
-
C++で指定文字列のカウント方法...
おすすめ情報