質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

5779閲覧

CreateFileによるファイル操作にて、結果が「INVALID_HANDLE_VALUE」となる

yasu2711

総合スコア7

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/04/13 03:40

編集2020/04/13 11:52

前提・実現したいこと

RS485通信を用いてインバータの制御を行うプログラムを開発しております。

発生している問題・エラーメッセージ

エラーではないのですが、18行目CreateFileにてhComに値を入力しますと、
hCom=0xffffffff でINVALID_HANDLE_VALUEとなります。
20行目のIf文以降に進めません。

該当のソースコード

Visual C++(Visual Studio 2019)

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <windows.h> #include <tchar.h> using namespace std; int main(int) { HANDLE hCom; // 通信ハンドル DCB hDcb; // 通信設定用の構造体 COMMTIMEOUTS hTim; // タイムアウト設定用の構造体 char szTx[0x10]; // 送信バッファ char szRx[0x10]; // 受信バッファ char szCommand[0x10];// コマンド DWORD nTx, nRx; // バッファサイズ格納用 int nSum; // サムコード計算用 BOOL bRet; int nRet; unsigned int i; //?????COM4ポートをオープンする ???? hCom = CreateFile(L"\\.\COM4", (GENERIC_READ | GENERIC_WRITE), 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); void error_dialog(HWND hWnd) { DWORD errorcode = GetLastError(); LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER // テキストのメモリ割り当てを要求する | FORMAT_MESSAGE_FROM_SYSTEM // エラーメッセージはWindowsが用意しているものを使用 | FORMAT_MESSAGE_IGNORE_INSERTS,// 次の引数を無視してエラーコードに対するエラーメッセージを作成する NULL, errorcode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),// 言語を指定 (LPTSTR)&lpMsgBuf, // メッセージテキストが保存されるバッファへのポインタ 0, NULL); MessageBox(hWnd, (LPCTSTR)lpMsgBuf, _TEXT("エラー"), MB_OK | MB_ICONINFORMATION); LocalFree(lpMsgBuf); }; if (hCom != INVALID_HANDLE_VALUE) { //???? COM4ポートの通信設定をする ???? GetCommState(hCom, &hDcb); // 現在の通信情報を取得 hDcb.DCBlength = sizeof(DCB); // 構造体サイズ設定 hDcb.BaudRate = 19200; // 通信速度=19200bps hDcb.ByteSize = 8; // データ長=8bit hDcb.Parity = 2; // 偶数パリティ hDcb.StopBits = 2; // ストップビット=2bit bRet = SetCommState(hCom, &hDcb); // 変更した通信情報の設定 if (bRet == TRUE) { //???? COM1ポートのタイムアウト設定をする ???? GetCommTimeouts(hCom, &hTim); // 現状のタイムアウト値取得 hTim.WriteTotalTimeoutConstant = 1000; // 書込みタイムアウト1秒 hTim.ReadTotalTimeoutConstant = 1000; // 読込みタイムアウト1秒 SetCommTimeouts(hCom, &hTim); // 変更したタイムアウト値設定 //???? 局番1のインバータをネットワーク運転モードに切り換えるコマンドを設定 ???? sprintf(szCommand, "00FB10000"); // 送信データ(NET運転書込み) nTx = strlen(szCommand); // 送信データサイズ //???? サムコードを生成する ???? nSum = 0; // サムデータ初期化 for (i = 0; i < nTx; i++) { nSum += szCommand[i]; // サムコードを計算 nSum &= (0xff); // データをマスク } //???? 送信データを生成する ???? memset(szTx, 0, sizeof(szTx)); // 送信バッファ初期化 memset(szRx, 0, sizeof(szRx)); // 受信バッファ初期化 sprintf(szTx, "\5%s%02X", szCommand, nSum);// ENQコード+送信データ+サムコード nTx = 1 + nTx + 2; // ENQコード数+送信データ数+サムコード数 nRet = WriteFile(hCom, szTx, nTx, &nTx, NULL); //???? 送信 ???? if (nRet != 0) { nRet = ReadFile(hCom, szRx, sizeof(szRx), &nRx, NULL); //???? 受信 ???? if (nRet != 0) { //???? 受信データを表示する ???? for (i = 0; i < nRx; i++) { printf("%02X ", (BYTE)szRx[i]);// 受信データをコンソール出力 // アスキーコードを16進数で表示します。'0'の場合30と表示します。 } printf("\n\r"); } } } CloseHandle(hCom); // 通信ポートを閉じる } }

試したこと

https://stackoverrun.com/ja/q/3960970 を参照して
「COM4」を「.\COM4」という表記にしてみました。
エスケープシーケンスとして正しく認識されませんでした。
おわかりの方がいらっしゃいましたらお教えください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/04/13 03:42

まずはCOM4ってちゃんとあるのかを確認しよう
dodox86

2020/04/13 04:01 編集

CreateFile() 実行直後、GetLastError()APIでエラーコードを確認してください。ほとんどはそれで原因が分かります。 こういう場合はまず、APIリファレンスを確認しましょう。 CreateFile https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea > if the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.
yasu2711

2020/04/13 06:01

y_waiwai様 早速の回答を頂きましてありがとうございます。COM4はデバイスマネージャにて確認をしております。
yasu2711

2020/04/13 11:55

dodox86様 回答を頂きましてありがとうございました。void error_dialog(HWND hWnd)を追加してcodeを変更しましたが、「'error_dialog': ローカル関数の定義が正しくありません。」というエラーが発生しております。下記のサイトを参考にしました。 http://yamatyuu.net/computer/program/sdk/base/errmsg1/index.html
dodox86

2020/04/13 15:11

>yasu2711 さん C言語にまだ不慣れでしたでしょうか。「ローカル関数の定義が...」というコンパイルエラーは定義の仕方が間違っていたのだと思います。error_dialog関数を自作するまでもなく、例えばDWORD err = GetLastError(); としてerrの値を確認すればよい、というお話でした。問題は解決されたようなのでもうよいと思います。
yasu2711

2020/04/13 23:34

C++始めたばかりです。今後のためにもGetLastError()についてマスターをしたいと思います。ありがとうございます。
guest

回答2

0

ベストアンサー

hCom = CreateFile(L"\.\COM4", ...

ってことでどうでしょう

投稿2020/04/13 06:04

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yasu2711

2020/04/13 11:57

回答を頂きましてありがとうございます。上記の修正を行い、USBを接続しましたところ解決しました。
yuki23

2020/04/13 14:23

解決した場合は、解決済みにしてベストアンサーを選びましょう
guest

0

  1. COM4は本当に存在しますか?
  2. 他のプログラムでCOM4を開いていませんか?

投稿2020/04/13 03:53

yuki23

総合スコア1448

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yasu2711

2020/04/13 11:58

回答を頂きましてありがとうございました。hCom = CreateFile(L"\\.\COM4", としてUSBを接続しましたら解決しました。アンサーのおかげです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問