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;
}
初心者で至らないこともございますがよろしくお願いします。
com_Open等をfopen等のLinux用に書き変えるには
Re: com_Open等をfopen等のLinux用に書き変えるには
fopenなどの高水準入出力関数ではなく、openなどの低水準入出力関数を使わないといけないかもしれません。
[search=google]linux シリアルポート C言語[/search]
ただし、comという関数名に関係なく、シリアルポートを使うわけではないのであれば、fopenなどでもできるかもしれません。
そもそも、com_Openの定義は提示されていますが、
その他の関数の動作が不明(想像はできるが、全く別の動作かもしれない)なので、できるかどうかはわかりません。
[search=google]linux シリアルポート C言語[/search]
ただし、comという関数名に関係なく、シリアルポートを使うわけではないのであれば、fopenなどでもできるかもしれません。
そもそも、com_Openの定義は提示されていますが、
その他の関数の動作が不明(想像はできるが、全く別の動作かもしれない)なので、できるかどうかはわかりません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
com_Open等をfopen等のLinux用に書き変えるには
みけ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;
}
上記のような使われかたです
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用に書き変えるには
コードを提示するときはBBcodeを有効にした状態でcodeタグで囲み、
かつ適切なインデントをしていただけると、見やすくて助かります。
シリアルポートの設定や操作は入らず、単純なファイル入出力のみのようですね。
でしたらfopenなどでもできると思うので、実際に実装してみて、動かなければまた質問するといいと思います。
かつ適切なインデントをしていただけると、見やすくて助かります。
シリアルポートの設定や操作は入らず、単純なファイル入出力のみのようですね。
でしたらfopenなどでもできると思うので、実際に実装してみて、動かなければまた質問するといいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)