No.1ベストアンサー
- 回答日時:
C++Builderは使ったことがないので、ReadFileの仕様は知りませんが・・・
「ReadFileを使ってシリアルポートからデータを読み出している」と捉えて宜しいのでしょうか?
ReadFileはおそらくポートにデータが届いていることを前提に読み出すような使い方をするものだと思います。つまり、ポートにデータが届いていなければ、データが届くまでループするのではないでしょうか。
昔、シリアル用のDOSプログラムをCで作っていましたが、Readの割り込みをかけるとポートからデータを読み取れるまで他の割り込みを受け付けてくれず、ハングアップしたような状態になったのを覚えています。
eofのような関数は無いでしょうか?ファイルに読み込めるデータが残っているか否かをチェックする関数です。仮にeof関数と呼びます。eof関数があれば、それを使ってポートにデータが届いているか否かをチェックし、届いていたら届いている分だけ受信するようにReadFile文を書き換えてみてはどうでしょう。
eof関数はループで何度も呼び出しますが、1回呼び出すごとに、データが無ければSleepを0.1秒入れるようにしてみてください。データがあれば連続してeof関数を呼び出します。
このように、データの着信チェックを0.1秒間隔に入れ、着信したらReadFileで取り込むというようにすれば、100%になることは無いと思います。
C++Builderは使ったことがないので自信はありませんが・・・。Windowsのようなマルチスレッド、マルチプロセスのOSでは、Sleepを入れてCPUを開放するのは常套手段です。
この回答への補足
etaroさん
回答が遅くなってしまい、申し訳ありません。
処理としてはetaroさんが言うとおり、「ReadFileを使ってシリアルポートからデータを読み出している」という形です。
現在のモジュールを簡略化してみました。
void DataSend()
{
// ポートオープン処理(DCB,タイムアウトの設定も含む)
if (!comm->Open()) return;
// データ送信
for (i = 0; i < DataSize; i++) // 転送データサイズ分
{
// プログラムイメージ送信(1バイトデータ)
if (!comm->Write(Data, 1)) // Data:1バイトデータ
{
comm->Close(); // ポートクローズ
return;
}
// echo受信
if (comm->Read(&rcv, 1) == -1)
{
switch (comm->errorno)
{
case TIMEOUT_ERR:
break;
case PORT_ERR:
break;
default:
break;
}
comm->Close();
return;
}
// echo判定
if (rcv != Data)
{
comm->Close();
return;
}
}
//////////////////////////////////////////
int Read(char *buf, unsigned long len)
{
BOOL res;
DWORD receive;
if (hcomm == INVALID_HANDLE_VALUE)
{
errorno = PORT_ERR;
return -1;
}
// 受信処理
if (!ReadFile(hcomm, buf, len, &receive, NULL))
{
errorno = PORT_ERR;
return -1;
}
// 受信判定
if (receive == 0)
{
errorno = TIMEOUT_ERR;
return -1;
}
errorno = NO_ERR;
return receive;
}
このような処理になっています。
No.2
- 回答日時:
一般にシリアルからの入力は、入力自体が割り込みを起こすのでReadFileは入力データが到達するまでの間はCPUを占有しません。
よって、ReadFileがCPUをつかんでループしてしまう状況(この状況をスピンといいます)の発生要因としては
・シリアル入力のドライバがおかしい
・設定がおかしい
という可能性が高いと思われます。
シリアルポートのデバイスが何であるか?
ドライバは何を使っていて、どういう常態か?
設定はどうなっているか?
いろいろと不明なので自信はありません。
この回答への補足
toysmithさん
回答が遅くなってしまい、申し訳ありません。
こちらの環境及び設定内容を補足致します。
(1)環境
エンジン基板に対してRS232CのストレートケーブルでノートPCと接続
(2)設定内容
DCB構造体の設定
dcb.BaudRate = 57600;
dcb.ByteSize = 8;
dcb.Parity = parity; // NOPARITY:0
dcb.fParity = (parity) ? TRUE : FALSE;
タイムアウトの設定
tout.ReadTotalTimeoutMultiplier = 1;
tout.WriteTotalTimeoutMultiplier = 1;
tout.ReadIntervalTimeout = 2000;
tout.ReadTotalTimeoutConstant = 2000;
tout.WriteTotalTimeoutConstant = 2000;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ビデオカード・サウンドカード メイン機とは別に、初自作としてpcを組みました。 pcスペック cpu ryzen5 5500 グラ 1 2023/05/15 12:22
- ビデオカード・サウンドカード グラフィックボード増設について 9 2023/05/17 11:06
- 画像編集・動画編集・音楽編集 PowerDirector21 動画出力時のCPU稼働率が急に下がってしまう原因を教えてください 2 2023/03/30 20:54
- ノートパソコン パソコンが重い。 職場で使用しているパソコンが夏休み明けあたりから急に重くなりました。 (特定のソフ 10 2022/09/06 17:30
- UNIX・Linux 低スペックPCで軽量Linuxを動かしました。軽快に動かすには間隔をあけるとのが有効ですか? 3 2022/07/30 13:13
- CPU・メモリ・マザーボード パソコンでCPUとメモリー、優先は? 11 2023/01/11 17:19
- ビデオカード・サウンドカード Media EncoderやStreamlabsDesktopのハードウェアエンコードについて 2 2023/03/25 12:16
- CPU・メモリ・マザーボード パソコンについて パソコンcpu Inteli54460 HDDからSSDに交換してから起動直後、ア 7 2023/08/23 10:57
- タブレット 10インチ中華タブレットで公衆フリーWiFiの受信が弱いのはなぜ? 5 2022/10/14 12:06
- iPhone(アイフォーン) スマホの節電モードについて cpu高速処理コアと効率コア節電モードオンにすると効率コアだけ使われるん 1 2023/08/05 22:51
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
配列でデータが入っている要素...
-
メモ帳(テキストデータ)をExc...
-
プログラミング python pandas ...
-
この行は既に別のテーブルに属...
-
【エクセル】測定時間がバラバ...
-
VBA 空白セルを削除ではない方...
-
send-recvで複数データの送受信
-
VBA 判定文で理解できない結果...
-
VBAを使ってOutlookメール本文...
-
[COBOL]日付比較
-
共有メモリへのマッピング(Map...
-
S9タイプからXタイプにデータ...
-
VBA 該当データがない時 ...
-
CString型の文字列連結について
-
特定のデータの抽出方法を教え...
-
標準ブラウザ情報の取得
-
エクセルで2つの時系列のデー...
-
サムチェックのルール
-
ACCESS VBA インデックスが有効...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
配列でデータが入っている要素...
-
多量のSUMIF式を軽くしたい
-
エクセルで2つの時系列のデー...
-
Excelのマクロでワードのテキス...
-
メモ帳(テキストデータ)をExc...
-
VBA 空白セルを削除ではない方...
-
VBAを使ってOutlookメール本文...
-
Accessで該当データにフラグを...
-
合計3TBのデータのハッシュ値を...
-
シーケンサにパソコンからアク...
-
S9タイプからXタイプにデータ...
-
カンマからスラッシュに
-
VBA 毎日取得するデータを順番...
-
VBAでシートからコンボボックス...
-
ビットシフトについて
-
ユーザーフォームのテキストボ...
-
EXCELVBAでSQLserverからデータ...
-
特定のデータの抽出方法を教え...
おすすめ情報