ページ 11

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

Posted: 2014年9月26日(金) 11:07
by プログラム人並み以下
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;
}

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

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

Posted: 2014年9月26日(金) 11:43
by みけCAT
fopenなどの高水準入出力関数ではなく、openなどの低水準入出力関数を使わないといけないかもしれません。
[search=google]linux シリアルポート C言語[/search]
ただし、comという関数名に関係なく、シリアルポートを使うわけではないのであれば、fopenなどでもできるかもしれません。

そもそも、com_Openの定義は提示されていますが、
その他の関数の動作が不明(想像はできるが、全く別の動作かもしれない)なので、できるかどうかはわかりません。

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

Posted: 2014年9月27日(土) 16:22
by プログラム人並以下
みけ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;
}

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

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

Posted: 2014年9月27日(土) 21:47
by みけCAT
コードを提示するときはBBcodeを有効にした状態でcodeタグで囲み、
かつ適切なインデントをしていただけると、見やすくて助かります。

シリアルポートの設定や操作は入らず、単純なファイル入出力のみのようですね。
でしたらfopenなどでもできると思うので、実際に実装してみて、動かなければまた質問するといいと思います。

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

Posted: 2014年9月29日(月) 10:53
by プログラム人並以下
提示するとき気をつけます。

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