7 years ago.

UARTでshort int の データーをmbedとmbedの間でやりとりしたい

UARTでshort int のデーターをやり取りしたいと思いプログラムを書いてみました。 スレーブマイコンからメインマイコンに送るように書いたつもりです。 今回はメインマイコンのピンをHIGHにして スレーブマイコンがメインマイコンのピンで割り込みで、 UARTでshort intのデータを送信するようにプログラムを書いてみました。

しかしうまくいきませんでした。mbed初心者なのであまりわかりません。 どうしたらいいか、教えていただけませんか。よろしくお願いします。

main(NucleoF303k8)

#include "mbed.h"
//master
/*intからcharへの分解
   分解の際
   dat1 = data % 256;
   dat2 = data / 256;
   復元の際
   data = dat2 * 256 + dat1;
   参考元:https://oshiete.goo.ne.jp/qa/6219385.html
 */
Serial pc(USBTX,USBRX);
Serial device(D5,D4);//スレーブとのTX,RX
DigitalOut Uart(D8);//ピン割り込みに使うピン(出力)
DigitalOut led(LED1);
Timer timer;
struct {
        char highbyte;
        char lowbyte;
        short intdat;
} data;

int read(){//読み込む関数
        Uart = 1;//ピン変化割り込みするためにHIGHに
        wait_ms(5);
        Uart = 0;//元に戻す
        wait_ms(300);
        while(device.readable() == 1) {
                        if(device.getc() == 'H') {//ヘッダ
                                pc.printf("waiting");
                                data.lowbyte = device.getc();
                                data.highbyte = device.getc();
                        }
        }
        data.intdat = data.highbyte*256+data.lowbyte;//復元
        pc.printf("Re %d\r\n",data.intdat);
}

int main() {
        device.baud(115200);
        wait_ms(100);
        while(1) {
                pc.printf("start!!");
                read();//スレーブから読み込む
                wait_ms(100);
        }
}

slave(NucleoF303k8)

#include "mbed.h"
//slave
/*intからcharへの分解
   分解の際
   dat1 = data % 256;
   dat2 = data / 256;
   復元の際
   data = dat2 * 256 + dat1;
   参考元:https://oshiete.goo.ne.jp/qa/6219385.html
 */
Serial pc(USBTX,USBRX);
Serial device(D5,D4);
InterruptIn Uart(D8);//メインマイコンの割り込みピン
DigitalOut led(LED1);
struct {
        char highbyte;
        char lowbyte;
        short intdat = 0;
} data;

void sendTomaster(){
        data.highbyte = data.intdat%256;//分解
        data.lowbyte = data.intdat/256;//分解
        device.putc('H');//ヘッダをつける
        device.putc(data.lowbyte);
        device.putc(data.lowbyte);
        led = 0;
        pc.printf("riseing!\r\n");//割り込みした合図
}

int main() {

        led = 0;
        Uart.rise(&sendTomaster);//割り込み設定
        device.baud(115200);
        while(1) {
                data.intdat = 500;//送信したいデーター
                wait_ms(650);
                led =!led;//フリーズしていないか動作確認用
        }
}

1 Answer

7 years ago.

こんにちは。

送っていただいたプログラムでは、read() 関数で、割り込み用の信号をHighにすると、すぐに slave 側からデータが3byte送信されてしまうので、master 側からの読み出しができていないようです。

以下のように変更することで、正常に順できることを確認しました。

int read() //読み込む関数
{
    Uart = 1;//ピン変化割り込みするためにHIGHに

    while (device.readable() != 1);
    char c = device.getc();
    if(c != 'H') {
        Uart = 0;
        return 0;
    }

    while (device.readable() != 1);
    data.lowbyte = device.getc();

    while (device.readable() != 1);
    data.highbyte = device.getc();

    Uart = 0;//元に戻す
    
    data.intdat = data.highbyte*256+data.lowbyte;//復元
    pc.printf("Re %d\r\n",data.intdat);
}

また、slave 側のコードで、一部間違いだと思われる部分がありました。data.lowbyte が二回連続して送信されていますが、最初のデータは、data.highbyte を指定しなければならないと思います。

        device.putc('H');//ヘッダをつける
        device.putc(data.lowbyte);
        device.putc(data.lowbyte);

Accepted Answer

ありがとうございます!!情報がなかなか流れていないので悩んでいました。助かりました。

posted by Daiki Tomioka 23 Apr 2017