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

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

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

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

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

Q&A

2回答

4863閲覧

"const char *" の引数と型 "LPCWSTR" のパラメーターとの互換性のエラーを回避

yasu2711

総合スコア7

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

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

0グッド

0クリップ

投稿2020/04/11 02:20

前提・実現したいこと

通信機能を有するインバータをRS485通信にてコントロールするプログラムを作っています。
USB-RS485変換を行って、COM4ポートを割り当て通信を行います。

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

CreateFile("COM4", (GENERIC_READ | GENERIC_WRITE), 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
「 "const char *" の引数は型 "LPCWSTR" のパラメーターと互換性がありません」というエラーとなります。

if (hCom != NULL) {
「'const char [5]' から 'char' に変換できません」というエラーになります。

該当のソースコード

言語:Visual C++(Visual Studio 2019)

ソースコード
-#include <stdio.h>
-#include <windows.h>
using namespace std;
int main(int) {
HANDLE hCom; // 通信ハンドル
DCB hDcb; // 通信設定用の構造体
COMMTIMEOUTS hTim; // タイムアウト設定用の構造体
char szTx[0x10]; // 送信バッファ
char szRx[0x10]; // 受信バッファ
char szCommand[0x10];// コマンド
int nTx, nRx; // バッファサイズ格納用
int nSum; // サムコード計算用
BOOL bRet;
int nRet;
int i;
//?????COM4ポートをオープンする ????
hCom = CreateFile("COM4", (GENERIC_READ | GENERIC_WRITE), 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hCom != NULL) {
//???? 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://teratail.com/questions/118636 を参考にして、
void CreateFile( )という定義をしようとしたのですが、記述内容がわかりませんでした。

おわかりの方がいらっしゃいましたらお教えください。よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

CreateFile(L"COM4",...

投稿2020/04/11 02:24

episteme

総合スコア16614

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

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

yasu2711

2020/04/11 03:00

早速の回答を頂きましてありがとうございました。 hCom = CreateFile(L"COM4", (GENERIC_READ | GENERIC_WRITE), 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); このエラーは解消しました。 続けてエラーがあります。 nRet = WriteFile(hCom, szTx, nTx, &nTx, NULL); 「型 "int *" の引数は型 "LPDWORD" のパラメーターと互換性がありません」となっております。 nTxの型が間違っているのだと思いますが、修正方法お教えください。
episteme

2020/04/11 03:05 編集

line17: DWORD nTx, nRx; // バッファサイズ格納用 じゃなくて?
yasu2711

2020/04/11 04:32

早速の回答をありがとうございます。 DWORD nTx, nRx; に修正したことでエラーが無くなりました。 同様に「&nTx」も、「引数 4 を 'int *' から 'LPDWORD' へ変換できません。」のエラーがあります。 DWORD &nTx に修正しましたが、「参照 変数 "nTx" には初期化子が必要です」のエラーが出てしまいます。いかが修正すれば良いかお教えください。
episteme

2020/04/11 05:45

改めて質問を起こしてください。
guest

0

ソリューションエクスプローラでプロジェクト名を右クリックして、一番下のプロパティ
を選択し、開いたプロパティページの構成プロパティ全般文字セット
「UNICODE文字セットを使用する」から「マルチバイト文字セットを使用する」に変更する。

if (hCom != NULL) { を
if (hCom != INVALID_HANDLE_VALUE) { に変更する。

投稿2020/04/11 02:49

kazuma-s

総合スコア8224

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

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

yasu2711

2020/04/11 04:25

回答を頂きましてありがとうございます。プロパティにて、文字セットを「マルチバイト文字セットを使用する」に変更しました。また、プラットフォームを×64に変更しました。根本的なところで間違っておりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問