こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

2進数でのシリアル通信

シリアルを用いてデータを伝送するプログラムを作りたいのですが、よく分かりません。
10進数では出来たのですが2進数に変換する際に上手く行きません。


シリアル通信のプログラムとして以下を使用しています。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <fcntl.h>
#include <errno.h>

#define BAUDRATEB9600 //hentyou-kaisu per second
#define BSIZE64 //byte size
#define CR0x0D // carriage return

int fd; //file descriptor 0:H-nyuryoku,1:H-syuturyoku,2;error
struct termios otio;

int
open_serial_port(char *modem_dev) //modem_dev = serial_dev
{
struct termios ntio;

if ((fd = open(modem_dev, O_RDWR | O_NOCTTY)) < 0) { // O_RDWR=read&write O_NOCTTY=
perror(modem_dev);
exit (1);
}
tcgetattr(fd, &otio); //tanmatsu-no-now-settei-syutoku

memset(&ntio, 0, sizeof(ntio));

ntio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
ntio.c_cc[VTIME] = 0; //burst-de-datadenso-wo-timeout-surutameno-timer
ntio.c_cc[VMIN] = 1; //jyusin-moji-no-min

tcflush(fd, TCIFLUSH); // not read data-wo flash
tcsetattr(fd, TCSANOW, &ntio); //new-tanmatsu-settei-watasu

return (0);
}

void
close_serial_port(void)
{
tcsetattr(fd, TCSANOW, &otio); //motono-settei-ni-modosu
close(fd);
}

int
main(int argc, char **argv)
{
char *serial_dev;
// char buf[BSIZE]; //data-wo-kakikomu-buffa-no-top-address
char *buf = (char *)malloc(sizeof(char)*64);
char msg[BSIZE];
int i,j;

j=0;

if (argc != 2) {
fprintf(stderr, "usage : %s serial_dev\n", argv[0]);
exit (1);
}
serial_dev = argv[1]; //device to write e.g. /dev/ttyUSB0

memset(buf, '\0', BSIZE); //m byte memory block no set \0=char-gatano-0
memset(msg, '\0', BSIZE); //syokika

open_serial_port(serial_dev);

i = 0;
while (1) { //infinite loop
sprintf(buf, "%d,", i); //printf-wo-buf-ni
j = strlen(buf);
write(fd, buf, j); //write to modem-device
printf("%s\n", buf);

sleep (2);

//read(fd, msg, BSIZE);
//printf("%s\n", msg);

i++;
if (i >= 10) i = 0;
}
close_serial_port();
free(buf);

exit (0);
}


2進数変換プログラムは、

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int i, n;
int bits[1024];
int digit, amari;

printf("10進数: ");
scanf("%d", &digit);

n=0;
while(digit>=1){
amari = digit % 2;
/* 配列変数に順番に代入して */
bits[n++] = amari;
digit = digit / 2;
}

/* 逆順に表示している */
for(i=n-1; i>=0; i--){
printf("%d", bits[i]);
}
printf("\n");

return 0;
}


この両者をつなぎ合わせたいのですが、どうすればよろしいでしょうか。

投稿日時 - 2012-09-21 11:34:43

QNo.7709270

すぐに回答ほしいです

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

>10進数では出来たのですが2進数に変換する際に上手く行きません。

もしかして「アスキー転送ではなく、バイナリ転送にしたい」って事?

今の質問者さんのプログラムだと「表現を10進数から2進数に変えるだけ」で、アスキー転送なのは変わりませんよ。

つまり、文字列で「"0,1,2,3,4,5,6,7,8,9,10,0,1,2,3,…"」と送る代わりに、文字列で「"0,1,10,11,100,101,110,111,1000,1001,1010,0,1,10,11,…"」と送る、ってだけの違いにしかならないですよ?

>この両者をつなぎ合わせたいのですが、どうすればよろしいでしょうか。

sprintf(buf, "%d,", i); //printf-wo-buf-ni

が、10進数の文字列をbufに作っている所。

n=0;
while(digit>=1){
amari = digit % 2;
/* 配列変数に順番に代入して */
bits[n++] = amari;
digit = digit / 2;
}

/* 逆順に表示している */
for(i=n-1; i>=0; i--){
printf("%d", bits[i]);
}
printf("\n");

が、digitを2進数にして表示している所。

「digitを2進数にして表示」の代わりに「digitを2進数にしてbufに作る」とやれば良い。

上の方のプログラムに

int k,n;
int bits[1024];
int digit, amari;

の宣言を付け足して

sprintf(buf, "%d,", i); //printf-wo-buf-ni

の行を消して、消した場所に

digit=i;
if(digit) {
/* digitが0じゃないなら */
n=0;
while(digit>=1){
amari = digit % 2;
/* 配列変数に順番に代入して */
bits[n++] = amari;
digit = digit / 2;
}
} else {
/* digitが0なら */
bits[0]=0;
n=1;
}
/* 逆順にbufに格納 */
k=0;
for(i=n-1; i>=0; i--){
/* buts[i]が0なら文字'0'を、1なら文字'1'を格納 */
buf[k++]=bits[i]+'0';
}
/* 後ろにカンマを足す */
buf[k++]=',';
/* 後ろに終端文字EOSを足す */
buf[k]='\0';

のプログラムを書き足す。

因みに、2進数作成プログラムが「digitが0の時にバグが出る」ので、0でも大丈夫なように対処してあります(iが0になるので)

投稿日時 - 2012-09-21 13:06:53

お礼

何とか解決しました。
ありがとうございました。

投稿日時 - 2012-09-21 21:04:42

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(1)

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-