シリアル通信がうまくいきません

01 Feb 2019

RS-485規格通信の実験をしているのですが、UARTの入出力を切り替えるピン(D4)の動作タイミングが合いません。 UARTはボーレートは2Mbps, データビットは8bit, 1bit ストップビット, パリティなしです。

main.cpp

#include "mbed.h"
 
Serial rs485(D8, D2, 2e6);
Serial pc(USBTX, USBRX, 9600);
DigitalOut dir(D4);
 
int main()
{
    while(1) {
        dir.write(true);
        rs485.putc(0x54);
        dir.write(false);        //←送信終了後、レスポンスの監視の為に同時に切り替えたい。
        wait_us(18);
 
        while(rs485.readable()){  //←受信できない
            pc.putc(rs485.getc());
        }
        wait_us(120);
 
    }
}

mbed上で実現できる範囲で対策すべき点はありませんか。

03 Feb 2019

具体的に必要なタイミングや波形などが分からないので何とも言えませんが、Streamクラスを継承しないRawSerialクラスがありますので、そちらを試してみてはいかがでしょうか?

https://os.mbed.com/docs/mbed-os/v5.11/apis/rawserial.html

20 Feb 2019

Toyomasa Watarai wrote:

具体的に必要なタイミングや波形などが分からないので何とも言えませんが、Streamクラスを継承しないRawSerialクラスがありますので、そちらを試してみてはいかがでしょうか?

https://os.mbed.com/docs/mbed-os/v5.11/apis/rawserial.html

返信が遅れてしまい申し訳ありません。どうやら、UARTの入出力(dirピン)の切り替えタイミングに問題があるようです。 試行した結果、Serialのストップビットが送信されたタイミングでdirピンを切り替える必要があることがわかりました。 つきまして、ストップビットが送信されたか(送信が完了したか)どうかを確認する関数等ご存じないでしょうか。

01 Mar 2019

Mbed OSのAPIでは、シリアル送信バッファエンプティ割り込みを発生させることは出来ますが(下記リンクをご参照ください)、送信完了割り込みはサポートされていないので、使用するマイコンの該当レジスタを直接操作する方法になると思います。

https://os.mbed.com/docs/mbed-os/v5.11/mbed-os-api-doxy/classmbed_1_1_serial_base.html#a554dccfc95f8e864de7be65a4a793e98