ページ 11

RDRに格納されたデータを別の配列に格納

Posted: 2017年1月19日(木) 17:12
by roro
1. 自分は今何がしたくて
 パソコンからシリアル送信された文字列(36~38字のCSV)をRX621マイコンで受信し、受信した文字列を配列A,B,C,D,Eに格納し、配列Aのみをパソコンへ送信したい

2. どう取り組んで(作ったプログラムはどれで
 パソコン-マイコン間のシリアル送受信のプログラムはできています。
 受信したデータはRX621マイコンのRDRレジスタに格納されています。
 プログラムは下にあります。

4. 自分は何が解らないのか、知りたいのか
 RDRレジスタに格納された文字列を、配列A,B,C,D,Eに格納するプログラムが分からない

5. 今のCの知識はどの程度なのか
 0から独学で始めて、数ヶ月たった程度

コード:

#include <machine.h>
#include <stdio.h>
#include <string.h>
#include "iodefine.h"

// #define USE_IR
#define DDR_IN   0
#define DDR_OUT  1

// LED (P15) 負論理
#define LED_DDR   PORT1.DDR.BIT.B2
#define LED_DR    PORT1.DR.BIT.B2
#define LED_OFF  1
#define LED_ON   0

static void delay_1ms(void)
{  // 実測でループ回数を決定
	unsigned int n = 20000;	
	while (n--)
		nop();
}

void delay_ms(unsigned int n)
{
	while (n--)
		delay_1ms();
}

void setup_clock(void)
{   // SCKCRはワードで一括指定しても良い。

	// ICLK x8
	SYSTEM.SCKCR.BIT.ICK = 0;
	while (SYSTEM.SCKCR.BIT.ICK != 0) ;

	// PCLK x4
	SYSTEM.SCKCR.BIT.PCK = 1;
	while (SYSTEM.SCKCR.BIT.PCK != 1) ;
}	

void setup_port(void)
{
	LED_DR = LED_OFF;
	LED_DDR = DDR_OUT;
	
	PORTD.DDR.BIT.B2=1;
	PORTD.DDR.BIT.B0=1;
	PORTD.DR.BIT.B2=1;
	PORTD.DR.BIT.B0=1;
		
	PORT1.DDR.BIT.B3=1;
	PORT3.DDR.BYTE=0x1c;
	PORT1.DR.BIT.B3=1;
	PORT3.DR.BYTE=0x1c;		
}

void SciInit(void)
{	// SCI1: P26/TXD1, P30/RXD1
	MSTP(SCI1) = 0;
	SCI1.SCR.BYTE = 0;
	PORT2.DDR.BIT.B6 = DDR_OUT;
	PORT3.DDR.BIT.B0 = DDR_IN;
	PORT3.ICR.BIT.B0 = 1;
	SCI1.SMR.BYTE = 0;
	SCI1.BRR = 12;  
	// wait 1 bit time
	// 1 / 9600 = 約 0.11ms -> 1msとする。
	delay_ms(1);
	SCI1.SCR.BYTE |= 0x30;  // TE=1,RE=1
}

void SciSend( char DATA)
{
	SCI1.TDR = DATA;  //送信データを格納
}

char SciRecv(void)
{
	char read_char;

	read_char = SCI1.RDR; //データを変数へ
	SCI1.SSR.BIT.RDRF=0;

	return read_char;
}

void main(void)
{
	char read_char;
	
	setup_clock();
	setup_port();
	SciInit();

	while(1){
     	PORTD.DR.BIT.B2=1;
	    PORTD.DR.BIT.B0=1;
		
		read_char = SciRecv();
		char DATA[38] = read_char;		
		SciSend(*DATA);
	}
		
}

Re: RDRに格納されたデータを別の配列に格納

Posted: 2017年1月19日(木) 18:12
by みけCAT
roro さんが書きました:パソコンからシリアル送信された文字列(36~38字のCSV)をRX621マイコンで受信し、受信した文字列を配列A,B,C,D,Eに格納し、配列Aのみをパソコンへ送信したい
受信したデータを各配列に振り分けるのは、どのような法則ですか?
roro さんが書きました: RDRレジスタに格納された文字列を
RX621マイコンは知らないですが、一般にマイコンのレジスタは8~32ビット程度だと思います。
RDRレジスタは文字列が格納できるくらい大きいのですか?
roro さんが書きました: 配列A,B,C,D,Eに格納するプログラムが分からない
まずは配列A,B,C,D,Eを作りましょう。
roro さんが書きました:

コード:

		char DATA[38] = read_char;		
これは、このマイコンの環境ではコンパイルが通るのですか?

受信したデータをDATAに格納するなら、

コード:

	char DATA[38];
	int data_count = 0; // 受信したバイト数

	while(1){
		PORTD.DR.BIT.B2=1; // ?
		PORTD.DR.BIT.B0=1; // ?
		
		read_char = SciRecv(); // データを受信する

		// ここで必要に応じてデータの終端判定などの処理を行う

		if (data_count < 38){ // バッファに空きがあるなら
			DATA[data_count++] = read_char; // バッファに受信したデータを格納する
		}

		// ここで必要に応じてデータの終端判定などの処理を行う

	}
みたいな感じになると思います。