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.
8 years, 7 months 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
8 years, 7 months 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);