問題タブ [rs485]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 「シリアル送信完了」 - RS485 の中断 [BeagleBoneBlack - オングストローム]
BeagleBoneBlack でアプリケーションを開発しています。組み込み Linux は私にとってまったく新しいものです =/
私が直面している問題は、RS485 通信を実装したいということです。SeriaLib-Library を使用して C++ コードを書きました。今のところ、専用の GPIO を使用して RS485 インターフェイスの方向を切り替えます。この時点まではすべて問題ありませんでした。
メッセージを書き込むには、関数 write を以下で使用します
唯一の問題は、最後のバイトが BUS に書き込まれた直後に DIRECTION ピンをトグルすることです =(
マイクロコントローラで開発している間、さまざまな割り込みなどに反応することは問題ありません。
カーネルの奥深くに解決策はありますか? - メッセージの送信に成功した後、ピン DIRECT を切り替えるには?
python - Beaglebone Black Angstrom を使用した半二重 RS-485 ブレークアウト ボードを介した自動 RTS を備えた Python PySerial
Angstrom (3.8 カーネル) を実行する Beaglebone Black を使用して、9600-N-8-1 の半二重 RS-485 ネットワーク上のデバイスと通信しようとしています。
これに似た RS-485 ブレークアウト ボードを使用しようとしています: https://www.sparkfun.com/products/10124、チップが MAX3485 http://www.maximintegrated.com/datasheet/indexであることを除いて.mvp/id/1079 . ピンと端子台があらかじめ組み立てられたボードを購入しました。私の友人がオシロスコープでテストしたところ、RS-485 ボードは動作することがわかりました。ボードには、BBB に接続する 5 つのピンがあります。3-5V (電源)、RX-I、TX-O、RTS、および GND。
UART4_RTSn
およびUART4_CTSn
ピンが使用できるように、BBB での HDMI サポートを無効にしました。
次に、RTS/CTS 制御で UART-4 を有効にするオーバーレイを見つけました。
オーバーレイをコンパイルして有効にしました:
このように485ボードをBBに接続しました
Pythonでは、次のようにシリアルポートを使用しようとしています:
USB から RS-485 へのコンバーターを使用して通信/dev/ttyUSB0
を設定rtscts=False
すると、双方向で問題なく動作するため、プログラムが動作することはわかっています。しかし、RS-485 ボードを使用して通信を正しく行うことができません。
RS-485 ボードには 2 つの問題があり、どちらも RTS に対応しています。
ボード上の RTS は、私が期待する方法とは逆に動作します。rs485 ボードの RTS ピンに電圧をかけると、ボード上の RTS LED がオフになり、ボードが送信されなくなります。RTS ピンから電圧を取り除くと、RTS LED がオンになり、ボードが送信されます。BBB の UART_RTSn ピンの極性を反転するにはどうすればよいですか?
Temporary solution: I've made a small bone script program that uses UART4_RTSn pin as input. It turns on a different GPIO when the UART4_RTSn pin is off and turns off that same GPIO pin when the UART4_RTSn pin is on. Then hooked up the RTS pin on the rs485 board to the GPIO pin instead of the UART4_RTSn pin.
/dev/ttyO4
これは不十分な解決策のようですが、コマンド ラインから にエコーするときに、RS485 ボードの RTS が正しいタイミングでオンになります。UART4_RTSn
ハードウェア構成を調整するか、pyserial の構成を変更して、ピンの極性を変更するにはどうすればよいですか?これにより、2番目の問題が発生します
問題1で述べたように
UART4_RTSn
、次のように値をttyポートにエコーすると、ピンは自動的に(ただし逆方向に)機能します。これにより
UART4_RTSn
、データの送信中に LED が点滅します。上記のボーンスクリプトを使用せずにセットアップすると、通常どおりオンになり、送信中に点滅します。私のbonescriptハックを使用すると、通常はオフになり、送信中に点滅します(これが私が望んでいることです)。ただし、これはコマンド ラインから echo を使用する場合にのみ機能します。Python を使用してシリアル ポートをセットアップすると、UART4_RTSn
ピンが非アクティブになります。送信中は点滅しません。Pythonでステートメントを作成するとすぐに:UART4_RTSn
ピンはシャットオフし、オフのままです。を使用して情報を送信する場合は点滅しませんser.write(stuff)
。その結果、rs485 ボードは送信に対応していません。UART4_RTSn
ピンをpyserialで自動的に動作させるにはどうすればよいですか? 設定rtscts=False
してみましたがダメでした。ピン値を使用
ser.setRTS(True)
またはser.setRTS(False)
手動で切り替えることができるので、正しいピンを使用していて、それが認識されていることがわかります。しかし、UART4_RTSn ピンを直接切り替えたくありません。シリアルポートがデータを送信しているときに自動的に動作するようにしたいのですが、Pythonではそうではありません。
どんな助けでも大歓迎です。
c - RS485 経由で PIC32 と通信する UART からの追加のガベージ バイト
これまでに機能していること:
- USB コンバータを搭載した PC から Click-Board RS485 を搭載した PIC32MX にバイトを送信する
- UART5 はデータの受信に使用され、これらのデータは UART4 を介して送り返され、ターミナルで読み取られます。
- バイトは正しくエコーされていますが、
問題:
- 「<0>」や 0x01 などの追加のガベージ バイトが PIC32 によって受信されます (私の PIC32 で既にデバッグしました)。
- 割り込みでデータをエコーするためにprintfを使用すると、受信されるバイト数が少なくなります(ただし、とにかくいくらか)
ここに私のコードがあります:
plib-Example のように PPSOutput を配置しませんでした。それは問題になるでしょうか?標準ピンを使用するため、ここでのマッピングは必要ないと思いますか?
どうにかして、あなたが私を助けてくれることを願っています。私は本当にイライラして一生懸命努力しましたが、なぜこれらの追加のバイトを受け取るのかわかりません。
編集:問題を解決しました:
ここで解決策を見つけました: http://www.edaboard.com/thread195556.html
事実は、データが利用可能になるまで待つ必要があるということです! 次の行を追加すると、完全に機能します!
c - MicroC rs-485、pic16f887 文字列送信の問題
マスター pic からスレーブに文字列 "MY STRING" を送信するにはどうすればよいですか?
MicroC RS-485 ライブラリの例を使用しています。
http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/rs-485_library.htm
マスターからスレーブに文字列を送信しようとしています: そして、dat[7] = "my string"; を設定します。私の文字列でスレーブにdat [7]を期待していますが、空の値を取得しています...
リンク下部の元のコード。
主人
スレーブ:
linux - 最初の呼び出し後にシリアル接続が NULL を返す
rs485 シリアル リンクを介して arduino と通信しようとしています。PCにUSBからシリアルrs485アダプターを接続し、arduino側にmax485を接続しています。開始するには、受け取ったものを送り返すスケッチをアップロードするだけです。
次に、接続をテストするために、シリアル ポートに文字を書き込み、応答をリッスンする python スクリプトを PC で実行します。
スクリプトを初めて起動すると、次のようになります。
スクリプトを再度起動しようとすると、次のようにしか書き込まれません。
PCを再起動した場合にのみ、再び機能し始めます(ちなみにubuntuを使用)。USBからシリアルへのコンバーターを抜き差ししても何も変わらず、arduinoを再起動しても同じ話です。ラズベリーパイで同じ構成を試しましたが、結果は同じです。USB ポートの変更が機能しません。arduino で同じスケッチを再度アップロードしても、何も起こりません。ピン 13 の LED が点滅するので、arduino は何かを送受信しています。serial.read() 関数が返されるので、何かが到着していますが、(最初の 1 回目以降は) null 文字 '\x00' です。ある肯定的なケースでは、再起動後、スクリプトをしばらく実行させようとしましたが、ctrl-c を押してスクリプトを再開するまで、すべてがうまくいきました。
これは、シリアル コンバーターを接続した後の dmesg です。
この後どうすればいいのかわからないので、助けていただければ幸いです。
編集 :
PC を再起動する必要はありません。USB コンバーターを処理するモジュール ch341 をアンロードしてから再度ロードすると機能します。コードの先頭に次の 2 行を追加しました。
問題が本当に解決しないことはわかっていますが、機能します。
編集 2: ドキュメントhttp://lxr.free-electrons.com/source/Documentation/serial/serial-rs485.txtを見て、c (i' m は C が苦手なので、ご容赦ください)
しかし、プログラムをコンパイルして実行すると、私が見るのはこれだけです:
ドライバーhttps://github.com/torvalds/linux/blob/master/drivers/usb/serial/ch341.cを見ると、ioctlを処理するための適切な機能がまったくないと思います。
c - Modbus でのマルチスレッド? 応答時間を 1 秒に保ちながら 500 ミリ秒でクエリを送信するにはどうすればよいですか?
MODBUSマスタースレーブ通信を実装しました。fun 6、16、3 を実装しました。応答時間を 1 分に設定しました。今の問題は、500ミリ秒でクエリを送信したいということです。しかし、この 1 秒の応答時間のため、2 番目のクエリを送信するには 1 秒待つ必要があります。応答時間を 1 秒に保ちながら、500 ミリ秒ごとにクエリを送信する方法。
前のクエリの応答も待っている場合、新しいクエリを送信することはできますか?
MODBUS 経由で低速のデバイスと通信するには?