はじめまして。以前にRX231を使ってPWM波形を出力する方法で質問させていただいたものです。
今度はシリアル通信(Uart)に挑戦しようと思って、まずは1バイトの文字を送ってその文字を受信する、
その次に任意のバイト数の文字列を送信し、それに応じてマイコンを動かすということを行いたいと考えているのですが、
1バイトの送受信が出来ずつまづいています。スマートコンフィグレータを使って生成されたコードを使って書いてますが、
ハードウェアマニュアルを読んでも具体的な書き方が分かりません。
下記どなたかご教授頂けないでしょうか?
何卒よろしくお願いします。
①自動生成された下記の関数の意味と使い分け
※SCI5を使用
<Config_SCI5.c>
MD_STATUS R_Config_SCI5_Serial_Receive(uint8_t * const rx_buf, uint16_t rx_num)→受信データの処理関数?
MD_STATUS R_Config_SCI5_Serial_Send(uint8_t * const tx_buf, uint16_t tx_num)→送信データの処理関数?
<Config_SCI5_user.c>
static void r_Config_SCI5_receive_interrupt(void)→受信割り込み時の処理関数?
static void r_Config_SCI5_receiveerror_interrupt(void)→受信割り込みエラー時の処理関数?
static void r_Config_SCI5_transmit_interrupt(void)→送信割り込み時の処理関数?
static void r_Config_SCI5_transmitend_interrupt(void)→送信割り込み完了時?の処理関数?(上記の関数と何が違う?)
static void r_Config_SCI5_callback_transmitend(void)→送信完了時の何らかの関数?
static void r_Config_SCI5_callback_receiveend(void)→受信完了時の何らかの関数?
static void r_Config_SCI5_callback_receiveerror(void)→受信エラー時の何らかの関数?
②下記のようにプログラムを書きましたが、Teraterm上から送った1バイトの文字が無数に帰ってきます。
一旦受信したデータをバッファに置いて、送信する、という趣旨の書き方をしたいのですが、どのように
書けばよいのかも分かりません。
#define BUFFERSIZE 32
static int RxBuffer [BUFFERSIZE ];
void main(void)
{
//InitとSCI5スタート
R_Config_SCI5_Start(void)
while(1)
receive();
transmit();
}
void recive(void)
R_Config_SCI5_Serial_Receive(&RxBuffer ,1);
void transmit(void)
R_Config_SCI5_Serial_Send(&RxBuffer, 1);
-----------------------------------------------------
下記自動生成されたコードの一部を編集してます。
static void r_Config_SCI5_receive_interrupt(void){//if (g_sci5_rx_length > g_sci5_rx_count)//{//*gp_sci5_rx_address = SCI5.RDR;//gp_sci5_rx_address++;//g_sci5_rx_count++;//}
SCI5.TDR = SCI5.RDR; //TDRにRDRを挿入し、受信データを返す。
//if (g_sci5_rx_length <= g_sci5_rx_count)//{ /* All data received */ SCI5.SCR.BIT.RIE = 0U; SCI5.SCR.BIT.RE = 0U; r_Config_SCI5_callback_receiveend();//}}
static void r_Config_SCI5_transmitend_interrupt(void){ /* Set TXD5 pin */ PORTA.PMR.BYTE &= 0xEFU;
SCI5.SCR.BIT.TIE = 0U; SCI5.SCR.BIT.TE = 0U; SCI5.SCR.BIT.TEIE = 0U;
r_Config_SCI5_callback_transmitend();}
YPekl39さん、こんにちは。NoMaYです。いろいろアドバイスがあると思いますが、私は、以下の投稿のようなコードを追加するのが良いのではないかなぁ、と思います、、、(以下はIICでの例ですがUARTでも同様です。また、RXスマートコンフィグレータでも同様です。)RX231のコード生成を用いた簡易IIC通信についてjapan.renesasrulz.com/cafe_rene/f/002-2095199602/6169/rx231-iic/34171#34171japan.renesasrulz.com/cafe_rene/f/002-2095199602/6169/rx231-iic/34173#34173 「今回、送信完了/受信完了を待つ送信関数名/受信関数名の末尾に _UWT を付けてみました。(unlimited wait timeの意。また、先頭を R_ ではなくて U_ にしてあります。ちなみに、STM32CubeMXでは送信完了/受信完了を待たない関数の名前の末尾に _IT を付けるようでしたので、逆向きに(?)真似てみました。)」「以下は私のチョンボですね。」
r_Config_SCI5_callback_receiveend()が呼ばれたら、受信完了です。 R_Config_SCI5_Serial_Receive()で指定したバッファに、長さ分のデータが格納された事になります。 受信完了フラグを用意(要volatile宣言)して、receive()を以下のようにすれば、1バイトの受信ができます。 receive() { 受信完了フラグクリア R_Config_SCI5_Serial_Receive(); 受信完了フラグセット待ち } r_Config_SCI5_callback_receiveend() { 受信完了フラグセット } なお、コード生成されたソースは元の状態に戻す必要があります。 スマートコンフィグレータのAPIマニュアルを見てみましたが、1文字送信の使用例があるだけで、初心者が使うには、ちょっと使う敷居が高いですね。