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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
#defineが使用するメモリ領域に...
-
printf による16進表示について
-
構造体メンバの初期化
-
fread(),fwrite()等について
-
C++で指定文字列のカウント方法...
-
【C言語】全角文字の配列を、全...
-
if文で…
-
大量のファイルを読み込み、そ...
-
2÷3などの余りについて
-
「指定されたキャストは有効で...
-
「Aに対するBの割合」と「Aに対...
-
ある商品のロス率を5%見込み、...
-
C言語でセルオートマトンを作成...
-
Aの値からBの値を除するとは??
-
マイナスからプラスへ転じた時...
-
20'(角度)の計算がわかりま...
-
信頼区間の1.96や1.65ってどこ...
-
DWORDの実際の型は何でしょうか
-
#if 1 #elseの意味について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
printf による16進表示について
-
#defineが使用するメモリ領域に...
-
C言語で複数列のデータを1列の...
-
C言語のプログラムで、途中で止...
-
reallocでエラー
-
【C言語】全角文字の配列を、全...
-
構造体メンバの初期化
-
char型2つを結合し、short型に...
-
空白を含んだ文字列がうまく格...
-
VC++でSQLへSELECT文を送ったの...
-
C言語でのCSVファイルの読み出...
-
エラーについて質問です。
-
setjmp・longjmpに関しまして
-
矢印キーを押下してコンソール...
-
タイムカードのシステムを作り...
-
大量のファイルを読み込み、そ...
-
C言語、ファイル操作、fgets()...
-
Cでファイルの行数をカウントす...
-
リストの作成と出力(C言語)
おすすめ情報