問題タブ [usart]
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++ - ATMega328p: USART 経由でバイトを送信する奇妙な動作
ModernDevice.com の USB to seal コンバーター (BUB) を介してコンピューターに ATMega328p (MCU) を接続しています。MCU は、TX、RX、および GND ラインによって BUB に接続されます。
U(S)ART を使用してデータを送信するには、このライブラリを使用します。このライブラリは、インターネットで見つけることができる多くのソリューションに基づいて作成され、ニーズに合わせて調整されています。
UART.h:
UART.cpp:
次のクラスは、UART を制御します。
COM.h:
COM.cpp:
メイン コードでは、次のコードが割り込みハンドラを実装しています。
COMModule.h:
したがって、このすべての紹介の後、問題は、MCU に接続してバイトを送信すると、TEST 2 と TEST 4 が実行されたときに端末で ASCII 応答しか得られないことです (メソッド Echo、COM.cpp で)。ループ内で char 配列または文字列配列にアクセスして配列文字を送信するたびに、デスクトップ ターミナルにゴミが表示されます。
何が間違っている可能性があるか推測できますか?
編集:ここに別の手がかりがあります:
Edit2: もう 1 つの事実。これがなぜなのか本当にわかりません:
c++ - AVR USART: データ レジスタを柔軟にする
arduinoのシリアルポートに書き込めるライブラリがあります。フォームの割り当てを使用します
書き込み用。私の知る限り、UDR0 はシリアル ポート 0 のデータ レジスタです。#define は、UDRn がこのデータ レジスタになることを意味します。ライブラリには、コンパイル時に UDRn を UDR1 に変更するフラグがあります。
ただし、同じライブラリを使用して、Serial0 と Serial1 に異なるデータを書き込みたいと考えています。そのため、UDR0 に書き込む 1 つのインスタンスと、UDR1 に書き込むインスタンスを 1 つ持つことができる必要があります。これを統一することは可能ですか?
何かのようなもの:
たとえば、レジスタへのポインタを取得できますか?
serial-port - VHDL - 整数を ascii または 8 ビット slv に効率的に変換する方法
シリアル経由で異なる (一定でない) 値を出力しようとしています。シリアル通信は正常に動作していますが、ASCII テーブルに基づいて、任意のサイズと値の整数/自然/std_logic_vector/unsigned/signed 型を 8 ビット std_logic_vectors の配列に変換する、洗練された合成可能な方法はないようです。私がやろうとしていることは珍しいことではないので、それは非常に奇妙です。
これを行う 1 つの方法は、大きなルックアップ テーブルを使用するか、if-elsif-else ステートメントの長くネストされたチェーンを使用することですが、これは非常に非効率的で洗練されていないように思えます。
これは合成しません:
ISE 14.7 は、一部のヘッダー ファイルが原因で発生したあいまいなエラーで中断します。機能したとしても、0 ~ 255 以外の値では機能しません。これを行う正しい方法は何ですか?
編集:
0 から 9999 までの整数値をカバーするための簡単で汚い関数を作成しました。クロックされたプロセスや追加のエンティティなどは必要ありません。これまでに提案された答えは、過度に複雑に見えます。
ご想像のとおり、他に 3 つのメソッドがあります。
この関数について何を言おうとしますが、数サイクル後ではなく、必要なときに正しい結果を生成し、シンプルでわかりやすいことを覚えておいてください。負の数と大きな数をカバーするように簡単に拡張できます。
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)
arduino - デバイスが UART コマンドに応答しない
私は Arduino mega2560 と EZO EC (Electrical Conductivity) を使用しており、Serial.print() 関数を使用してコマンドを送信しようとしています。Arduino IDE 1.6.7 を使用しています。
オンラインで見つけた、正常に動作するように見えるコードがいくつかあります。しかし、私のコードが機能しない理由を知りたいです。EC センサーが、送信しているデータを取得していないようです。データが送信されていないようです。
私はそれが正常に動作し、期待どおりに動作するコードでセットアップをテストしたので、それが私の接続ではないことを知っています.
オンラインで見つけたコードは次のとおりです。
これが私のコードです:
Serial3.print はセンサーに送信されません。しかし、他のコードも Serial3.print() 関数を使用して文字列を送信し、正常に動作します。何が間違っているのかわかりません。
センサーから入ってくるものを取り込む手順を書く必要があることは理解しています。しかし、そもそもセンサーに何も送信されていないようです!
どんな助けでも大歓迎です。ありがとうございました