• ベストアンサー

データ型変換

ファーム初心者です。 あるマイコンのA/Dを使用し、読み取ったA/D値をシリアル(RS232C)で 送信しようとしているのですが、そこで質問です。 A/D値はlong intで返ってくるのですが、 それをasciiコードに変換しシリアル送信しTeraTermで表示させたいのですが、その変換方法がわかりません。 ltoa というのがおそらくこれにあたると思うのですが、 この ltoa の中身が知りたいのですが、 どなたかご存知ないでしょうか?? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

> A/D値はlong intで返ってくるのですが、 > それをasciiコードに変換しシリアル送信しTeraTermで表示させたいのですが、その変換方法がわかりません。 単純にライブラリのソースが必要なのでは無いのですね。 Cでプログラム作りました。 #define KETA 11 char *ltoa(long int a, char *c){ long int a0 = a; int i, s=0; if(a0 == 0x80000000){ c[0]='-',c[1]='2',c[2]='1',c[3]='4',c[4]='7',c[5]='4',c[6]='8',c[7]='3',c[8]='6',c[9]='4',c[10]='8',c[11]='\0'; return c; } if(a0<0) {a0 = ~a0 + 1; s=1;} c[KETA] = '\0'; for(i=0;i<KETA;i++){ c[KETA-i-1] = a0%10 + '0'; if(a0 == 0){ if(s) c[KETA-i-1] = '-'; else i--; break; } a0 /= 10; } return &c[KETA-i-1]; } main(){ char a[KETA+1]; puts(ltoa(1024, a)); puts(ltoa(-1024, a)); puts(ltoa(0x7fffffff, a)); puts(ltoa(0x80000000, a)); puts(ltoa(0x80000001, a)); puts(ltoa(0xffffffff, a)); }

man_u
質問者

お礼

ありがとうございます。 ビンゴの回答でした! 参考にさせていただき、無事動作しました♪ ホント助かりました。

その他の回答 (3)

回答No.4

gccにないけれど version 0.4 が好きです。 http://www.jb.man.ac.uk/~slowe/cpp/itoa.html /* A sample program by gcc on Mac OSX * file name: sample.c * compile: gcc sample.c * execution: ./a.out */ #include <stdio.h> /* プロトタイプ宣言 */ char *itoa(int, char*, int); int main(void) { int a; char result[32]; printf("Input n? "); scanf("%d", &a); printf("int(%d) => hex(0x%s)", a, itoa(a, result, 16)); printf("=> binary(%s)\n", itoa(a, result, 2)); return 0; } /* C version 0.4 char* style "itoa": * Written by Luka`s Chmela * Released under GPLv3. */ char* itoa(int value, char* result, int base) { // check that the base if valid if (base < 2 || base > 36) { *result = '\0'; return result; } char* ptr = result, *ptr1 = result, tmp_char; int tmp_value; do { tmp_value = value; value /= base; *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; } while (value); // Apply negative sign if (tmp_value < 0) *ptr++ = '-'; *ptr-- = '\0'; while(ptr1 < ptr) { tmp_char = *ptr; *ptr--= *ptr1; *ptr1++ = tmp_char; } return result; }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

glibc にないかなぁ.

man_u
質問者

お礼

ありがとうございます。 探してみましたがよくわからなかったです。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

>ltoa というのがおそらくこれにあたると思うのですが、 >この ltoa の中身が知りたいのですが、 ltoaは使用できないのですか? それをつかえば、解決できると思うのですが・・・ また、sprintfを使えば、変換できますが、それも使えないでしょうか? もし、そうでしたら、自前でそのようなものを作るしかないのですが。

man_u
質問者

お礼

ありがとうございます。 ウソかホンマか知らないんですが、 標準関数はわりとCPUに負担がかかるから できれば使わないほうがいいという のを聞いたことあるので、自作しようと しました。 一緒ですかねf^_^;

関連するQ&A