問題タブ [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.
interrupt - STM32F303: RS485 バスの衝突後に USART 割り込みが繰り返しトリガーされる問題
USART の動作に問題があり、どなたか助けていただけないでしょうか! USART を 3 つ使用している STM32F303 を使用しています。そのうちの USART1 は、DE ラインが自動的に制御される非同期 RS485 ポートとして構成されています。マイクロコントローラの TX、RX、および DE ピンは TI SN65HVD1792 RS485 トランシーバに接続され、通信用に 4 つのライン (TX+、TX-、RX+、RX-) をユーザに提供します。
ほとんどの場合、まったく問題なく動作する割り込み駆動の USART 通信を使用しています。ただし、RS485 リンクが 2 線式 (TX+/RX+ と TX-/RX- が一緒に接続され、両方に使用される +ve/-ve ペアのワイヤを形成する) として構成されているというエラー状態の処理に問題があります。バス上の複数のデバイスが同時に送信を試みます。これが発生すると、STM32 は、電源が再投入されるまで、すべてのシリアル通信への応答を停止します。
何が起こっているのかを少し詳しく見てみると、stm32f3xx_it.c の USART1_IRQHandler が繰り返し呼び出されていることがわかります - ボードの電源を入れ直すまで何度も何度も。これは、stm32f3xx_hal_uart.c で HAL_UART_IRQHandler(&huart1) を呼び出します。その機能は、どの割り込みが発生したか (パリティ エラー、フレーム エラー、ノイズ エラー、オーバーラン、ストップからのウェイクアップ、rx レジスタが空でない、tx 準備完了、tx 完了) をチェックすることです。適切に対処し、割り込み状態をクリアしてください。ただし、これらの特定の割り込みはいずれもトリガーされたとは認識されません。実行はすべての「if」ステートメントを通過するだけで、関数は終了し、再び実行されます。
認識されたエラー状態がスローされないため、これが発生したことを認識する方法が見つかりません。RS485 バスの競合は、優れたシステム設計によって回避すべきものであることは承知していますが、システムが顧客のインストールにある場合に発生する可能性を排除することはできません。エラー、「clashed」メッセージを無視して続行 - 電源を再投入する必要があることは容認できません。
この状態を認識する/システムが割り込みループに入るのを止める方法について、誰かアイデアはありますか?
前もって感謝します
割り込みルーチンは次のとおりです (HAL ファイル バージョン 1.2.0、日付 13 Nov 15)
c# - C#: RS485 から送信された特定の文字を待機しています
私のアプリでは、マイクロコントローラーにデータを送信しています。私はデータを送信し、マイクロコントローラーはプログラムを実行し、文字 ("K") を送信します。アプリケーションはこの文字を待機する必要があります。この文字を受信した後、データを再度送信する必要があります。
このキャラクターを受け取るのに問題がありました。関数 BytesToRead は文字を読み取る権利がありますか? 私のプログラムは、この関数の待機に達すると常に落ちます
vba - RS232 のコードが RS485 通信で機能しない
VBA for Excel を使用して、シリアル通信経由でハードウェアと通信しています。このコードは、http: //dev.emcelettronica.com/serial-port-communication-in-excel-vbaのような API 呼び出しを使用します。
rs232 では成功しましたが、rs485 では機能しません。データを送信して応答を読み戻した後、読み取りがタイムアウトになり、送信されたのと同じデータが読み取られます。
他の誰かが開発したソフトウェアにアクセスでき、そのソフトウェアが動作するので、ハードウェアが問題ないことはわかっています。私はシリアル ポート スニファを使用しましたが、それらのコードには多くの冗長性があるように見えますが、コードと同じ構成を使用し、同じデータを送信しているように見えます。しかし、彼らのコードは有効な応答を受け取りますが、私のコードはそうではありません。
この種の問題に対する基本的なトラブルシューティングのヒントを誰かが共有できますか?
vb.net - 受信したシリアルテキストを複数のテキストボックスに入れる方法は?
私はシリアル通信プロジェクトを行っており、どのボタンをクリックして最初の文字列を送信し、応答を呼び出すかに基づいて、受信した文字列をテキスト ボックスに入れたいと考えています。
ReceivedText のコードは次のとおりです。
これにより、受信した文字列がどちらか一方ではなく両方のボックスに送られます。
テキストを適切なボックスに入れる方法はありますか?
python - Rasperry pi uart およびカスタム rs485 ベースのプロトコル
Arduino Nano から送信されたラズベリー pi のプライマリ uart /dev/ttyAMA0 からのデータを読み取ろうとしています。
arduino側のライブラリhttps://gitlab.com/creator-makerspace/rs485-nodeproto
そこで、簡単な python スクリプトを使用して、arduino からのデータを検証します。
しかし、出てくるデータは、n回のうちx回ほど破損/間違っています。
良いパケットは A0 2 1 4F 50 45 4E B7 1B 80 のようになります
ほとんどの場合、不良パケット: 13 0a 7a 41 15 39 dd 1b 80 00
また、内部 uart の代わりに rs485 トランシーバーに接続された USB to UART を使用する場合、テスト スクリプトは正常に動作します。
私が間違っていることについての提案はありますか?
c++ - シンプルな C++/CLI SerialPort ReadByte (少なくとも、そう思った...)
そのため、VisualStudio と Arduino ベースのボードで C++/CLI を使用しています。私の目標は、RS485 経由で MODBUS を実装することです。
したがって、開発用のセットアップは次のとおりです...
FTDI USB-RS485インターフェースケーブルを介して、Arduinoシリアルポート「Serial1」に接続されたMaxim MAX3485チップに接続されたラップトップ。
Visual Studio で MODBUS プロトコルを作成し、Arduino に 5 つのレジスタ (5 バイト配列) の内容で応答するように要求してテストしています。何らかの理由を除いてすべてが機能します。結果を確認すると、戻りバイトが2つに分割されます。
IE.. Arduino から次のバイトを送信しています。
A は実際には「0A」ですが、端末ウィンドウには「A」としか表示されません。コンピュータ上のソフトウェアがバイトを受け取り、それらを配列に格納します。次に、受信したバイトを画面にテキストとして表示します。私が得るものは次のとおりです。
「1と4」、「2と8」などの間のスペースを除いて、これは正しいように見えます。これは、送信した10バイトではなく14バイトであることを示しています。
画面に各バイトをスペースで区切って表示しています。別のCOMポートのターミナルウィンドウを使用して、送信されるバイトが正しくフォーマットされていることを確認しました。問題はバイトの読み取りにあるのでしょうか?
私のArduinoコード:
ビジュアル スタジオ コード
読み取りバイト....
表示バイト...
stm32 - マスターとしての「Freemodbus」プロトコル
「Freemodbus」をマスター側として使用することは可能ですか? 私は stm32f4xx ARM プロセッサにそれを実装するつもりです
そうでない場合は、RS485 物理層で動作する代替プロトコルを紹介してください...
python-2.7 - pySerial (Delta Solar Inverter) を使用して RS485 データを読み取るときにバイトが欠落する
ソーラー インバーター (Delta RPI M6A) には、マスター/スレーブ RS485 バスがあります。マスターは、1 秒あたり数回インバーターに応答データ セットを送信するように要求し、インバーターはそれを実行します。合計通信セットは 176 バイトです。Raspberry Pi 3B は、FTDI FT232 USB-Serial (UART) IC コンバーターを使用してこのバスに接続されます。
バス上で送信されるデータの読み取りには、Python プログラムが使用されます。これは、特殊文字として解釈されるバイトがない場合にのみ正常に機能します (少なくとも、それは私が思うことです)。まず、入力を 1 バイトずつ読み取ります。適切な「送信開始」シーケンス (STX の後に ACK が続き、inverterID=1 が続く) が見つかると、160 バイトと終了シーケンスのデータ セットが期待されます。最後に読み取ったバイトは ETX (= ascii 3) である必要があります。
予想される出力は次 のとおりです。予想される出力のスクリーンショット
問題は、一部のバイトがエスケープや改行などの特殊文字に相当する場合、それらのバイトは ser.read() コマンドによって「認識」されないことだと思います。次に、数バイト早く ETX バイトを取得します。これは、途中のいくつかのバイトがキャプチャされなかったことを示しています。
コードの関連部分は次のとおりです。
キャプチャされたバイトは後で処理され、データベースへの書き込みが可能になります。
ser.read() と ser.readline() を試してみましたが、結果は同じでした。
私を正しい方向に向けるヒントがあれば感謝します。
ありがとう、ブラム
serial-port - USB デバイスで 10 MBit RS485 (UART) データストリームを生成する
USB デバイスで 10 MBit RS485 (UART) データ ストリームを生成する必要があります。今までは FT2232H が完全に適合すると思っていましたが、私の知る限り、サブディバイダーはメイン ディバイダー 0 と 1 に制限されているため、FT2232H は 12 MBit または 8 Mbit しか生成できません。USB デバイスは PC でシリアルとして列挙する必要があります。 10 Mbit のボーレートをサポートするインターフェース。
では、どのチップが特定のタスクに適しているかについて何か考えはありますか?
ありがとう。