com_Open等をfopen等のLinux用に書き変えるには

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
プログラム人並み以下

com_Open等をfopen等のLinux用に書き変えるには

#1

投稿記事 by プログラム人並み以下 » 11年前

Windows用のプログラムに使用されている
com_Open(LPCTSTR comName);
com_Close();
com_ReadLine(PBYTE lpBuff, DWORD readMax);
com_ReadPacket(PBYTE lpBuff, DWORD readMax);
com_Send(CONST PBYTE lpBuff, DWORD size);
com_SendString(LPCTSTR line);

等の上記のプログラムをLinuxで使用できるようにしたいと思っています。

fopen
fclose
fscanf
fprintf
fgetc
fclose
等で書き変えることはできますか?


com_Openについては下記のように使用されポートを開いてるようです。

BOOL com_Open(LPCTSTR comName)
{
HANDLE hCom;
hCom = CreateFile(comName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
if(hCom == INVALID_HANDLE_VALUE){
return FALSE;
}
s_hCom = hCom;
return TRUE;
}

初心者で至らないこともございますがよろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: com_Open等をfopen等のLinux用に書き変えるには

#2

投稿記事 by みけCAT » 11年前

fopenなどの高水準入出力関数ではなく、openなどの低水準入出力関数を使わないといけないかもしれません。
[search=google]linux シリアルポート C言語[/search]
ただし、comという関数名に関係なく、シリアルポートを使うわけではないのであれば、fopenなどでもできるかもしれません。

そもそも、com_Openの定義は提示されていますが、
その他の関数の動作が不明(想像はできるが、全く別の動作かもしれない)なので、できるかどうかはわかりません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

プログラム人並以下

com_Open等をfopen等のLinux用に書き変えるには

#3

投稿記事 by プログラム人並以下 » 10年前

みけCATさんさっそくの返信ありがとうございます。

BOOL com_Send(CONST PBYTE lpBuff, DWORD size)
{
DWORD dw;
return WriteFile(s_hCom, lpBuff, size, &dw, NULL);
}

BOOL com_ReadLine(PBYTE lpBuff, DWORD readMax)
{
DWORD dw;
BYTE c;
PBYTE p = lpBuff + s_cnt;
while (ReadFile(s_hCom, &c, 1, &dw, NULL) && dw == 1) {
if (c == '\r') {
*p++ = '\0';
s_cnt = 0;
return TRUE;
}
*p++ = c;
s_cnt++;
if (s_cnt >= readMax) {
s_cnt = 0;
return FALSE;
}
}
return FALSE;
}


BOOL com_ReadPacket(PBYTE lpBuff, DWORD readMax)
{
DWORD dw;
BYTE c;
PBYTE p = lpBuff + s_cnt;

if (readMax < PACKET_SIZE) {
return FALSE;
}

while (ReadFile(s_hCom, &c, 1, &dw, NULL) && dw == 1) {
if (s_bRecover) {
if (c == 'B' || c == 'E') {
s_bRecover = FALSE;
p = lpBuff;
*p++ = c;
s_cnt = 1;
} else {
}
} else {
*p++ = c;
s_cnt++;
if (s_cnt >= PACKET_SIZE) {
int i;
BYTE sum = 0;
for (i = 0; i < PACKET_SIZE - 1; i++) {
sum += lpBuff;
}
if (sum == lpBuff[PACKET_SIZE - 1]) {
s_cnt = 0;
return TRUE;
} else {
s_bRecover = TRUE;
s_cnt = 0;
return FALSE;
}
}
}
}
return FALSE;
}

上記のような使われかたです

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: com_Open等をfopen等のLinux用に書き変えるには

#4

投稿記事 by みけCAT » 10年前

コードを提示するときはBBcodeを有効にした状態でcodeタグで囲み、
かつ適切なインデントをしていただけると、見やすくて助かります。

シリアルポートの設定や操作は入らず、単純なファイル入出力のみのようですね。
でしたらfopenなどでもできると思うので、実際に実装してみて、動かなければまた質問するといいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

プログラム人並以下

Re: com_Open等をfopen等のLinux用に書き変えるには

#5

投稿記事 by プログラム人並以下 » 10年前

提示するとき気をつけます。

さっそく実装してみます。ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る