アプリ版:「スタンプのみでお礼する」機能のリリースについて

たびたびの質問失礼いたします。
前回シリアル通信によって文字化けがおきることについて質問させていただいたものです。
前回の質問後、10ビットのA/D変換データを文字列に置き換える方法を調べstatic void uint2Hex()によって文字列に置き換えを行っているのですがまだうまく解消できませんでした。
申し訳ないのですが再び助言をいただけないでしょうか。

H8/36064を使用しTera Termに取り込むことで確認を行っています。
ボーレートなどのシリアル通信の設定はマイコン側、Tera Term側であわせてあります。

#include "iodefine.h"
#include <machine.h> //割り込みマスクビット変更関数set_imask_ccr() を使用するためのインクルードファイル
#include <stdio.h>

void main(void)
{

init();
while(1){
if(AD.ADCSR.BIT.ADF == 1) Getad();
}
}

init() //A/D変換およびタイマV初期設定用関数
{
set_imask_ccr(1); //割り込み禁止設定
AD.ADCSR.BIT.SCAN = 1;
AD.ADCSR.BIT.CH = 101;
TV.TCRV1.BIT.ICKS = 0;
TV.TCRV0.BIT.CKS = 3; //Φ/128
TV.TCORA = 115-1; //コンペアマッチAの値
TV.TCRV0.BIT.CCLR = 1; //タイマカウンタクリア
TV.TCRV0.BIT.CMIEA = 1; //割り込み発生フラグ設定
set_imask_ccr(0); //割り込み禁止解除

}


void initSCI3(void) //シリアル通信設定
{
unsigned int dmy;
IO.PMR1.BIT.TXD = 1; //TXD端子使用設定
SCI3.SCR3.BYTE = 0; //SCR3クリア
SCI3.SMR.BYTE = 0; //SMRフォーマット設定
SCI3.BRR = 47; //9600bps
for(dmy = 280;dmy > 0;dmy--);
SCI3.SCR3.BIT.TE = 1; //送信動作許可
}

void rs_putc(char c) //1文字送信
{
while(SCI3.SSR.BIT.TDRE == 0); //トランスミットデータレジスタエンプティが真になるまで待機
SCI3.TDR = c; //トランスミットデータレジスタに送信データ(8bit)をセット
SCI3.SSR.BIT.TDRE = 0; //「送信中」フラグを立てる
}

void rs_puts(char *st) //文字列送信
{
while(*st != 0){
rs_putc(*st);
st++;
}
}

static void uint2Hex(unsigned long n, short upper, char *buf)
{
char c;
char a = 'a';
short len = 0;
short i, half;

if(upper) a = 'A'; // 大文字/小文字の設定

// 16進文字列へ変換し文字数をカウント
do{
i = n & 0x0F;
if(i > 9) buf[len] = (unsigned char)(i + a - 10);
else buf[len] = (unsigned char)(i + '0');
len++;
n >>= 4;
}while(n != 0);

half = len >> 1; // 文字の並び順を直す
for(i=0; i < half; i++){
c = buf[i];
buf[i] = buf[(len-1)-i];
buf[(len-1)-i] = c;
}


buf[len]='\0'; // 終端コードの挿入
}

Getad()
{
volatile unsigned int *data = (unsigned int *)0xfa00;
volatile unsigned int *data2 = (unsigned int *)0xfa10;

initSCI3(); // SCI3初期化
*data =AD.ADDRA;
*data = *data >> 6;//右に6bitシフト
*data2 =AD.ADDRB;
*data2 = *data2 >> 6;//右に6bitシフト
rs_putc(*data);
rs_putc(*data2);
AD.ADCSR.BIT.ADF = 0;
AD.ADCSR.BIT.ADST = 0;

}

#pragma interrupt (TimerV(vect=22)) //割り込み処理関数としてTimerVを宣言
void TimerV(void)
{
static int count; //20000回(0.1秒)ごとにGetad

// コンペアマッチフラグを0に戻し、次のコンペアマッチに備える。
TV.TCSRV.BIT.CMFA = 0;
if(count<100)
count++;
else {
count = 0;
AD.ADCSR.BIT.ADST = 1; //AD変換開始
}
}

A 回答 (3件)

具体的には


・何がどうなることを期待していて
・実際には何がどうなる
のでしょうか?

この回答への補足

data,data2に格納されたA/D変換のデータを16進数の文字列に変換し、
シリアル通信を使ってTera Teramに表示することが目的です。
しかし、今のままではTera Teramに表示はできるのですが、
送られてくるデータが文字化けしてしまっています。

補足日時:2015/01/20 16:16
    • good
    • 0

rs_putc(*data);


rs_putc(*data2);

の部分を以下の様に書き換えてみてください。

rs_putc(':');
rs_putc((*data / 1000) % 10 + '0');
rs_putc((*data / 100) % 10 +'0' );
rs_putc((*data / 10) % 10 +'0' );
rs_putc(*data % 10 + '0');
rs_putc(':');
rs_putc((*data2 / 1000) % 10 + '0');
rs_putc((*data2 / 100) % 10 +'0' );
rs_putc((*data2 / 10) % 10 +'0' );
rs_putc(*data2 % 10 + '0');

10進数で結果が出力されると思います。
    • good
    • 0

> static void uint2Hex()によって文字列に置き換えを行っているのですが



とのことですが、unit2Hex() は一度も呼ばれていないようです。
つまり、文字列の置き換えなどされてないと言うことです。

また、data1, data2 をそれぞれ、0xfa00, 0xfa10 番地に割り当てているようですが、これも意図が理解できません。
ここには、未定義のレジスタが存在するようですが、定義されないところを何かに使うのは、良くない気がします。

その他にも、rs_puts() が定義してあるのに使っていないとか、ずいぶんと不思議な気がします。


他のところがあっているとすれば、

Getad()
{

unsigned int data;
char buff[16];


initSCI3(); // SCI3初期化
data = AD.ADDRA >> 6;
uint2Hex(data, 0,buff);
rs_puts(buff);
rs_putc(':'); // 区切り記号(適当に)

data = AD.ADDRB >> 6;
uint2Hex(data, 0, buff);
rs_puts(buff);
rs_putc('\x0d'); // 区切り記号(適当に)

AD.ADCSR.BIT.ADF = 0;
AD.ADCSR.BIT.ADST = 0;

}

こんな感じで、16進の文字列で出てくる気がします。

data も省くなら、

Getad()
{
char buff[16];


initSCI3(); // SCI3初期化
uint2Hex(AD.ADDRA >> 6, 0, buff);
rs_puts(buff);
rs_putc(':'); // 区切り記号(適当に)

uint2Hex(AD.ADDRB >> 6, 0, buff);
rs_puts(buff);
rs_putc('\x0d'); // 区切り記号(適当に)

AD.ADCSR.BIT.ADF = 0;
AD.ADCSR.BIT.ADST = 0;

}

でも、いけるのではないかと思います。
    • good
    • 0
この回答へのお礼

ありがとうございました。おかげさまでTera Term上に表示させることができました。

data,data2にそれぞれ0xfa00,0xfa10を割り当てたのはHEW上で確認を行うためのものでした。

お礼日時:2015/01/20 17:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!