Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
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);