問題タブ [baud-rate]
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
RS485 2 線式システムを介した ModBus プロトコルの実装を任されています。(実際には、A/B と GND の 3 本のワイヤです)。ModBus は要点ではありませんが、その前のステップです... インターフェイスを介した単純な I/O です。
FTDI USB-RS485 コンバーターを使用して、Linux ホスト (交換不可) を Windows ホスト (別の Linux ホストと交換可能ですが、それは避けたいと思います) に接続しています。
エンコーディングは 19200, 8, n, 1 のはずですが、うまくいかないようです。
手元に正確なコードはありませんが、Linux では次のようにしています。
次に、ポートを構成します。
パリティとフロー制御は現在計画されていません。最終結果が低レベルのボードに接続され、そこで信号を自分で処理する必要があるためです。さらに、「自由な通信」を可能にするワイヤーはありません。(結局のところ、送信できるバイト範囲を XON/XOFF 文字で制限したくありません)
これらの機能はすべて正常に実行され、データが設定されます。
Windows では、次のようにシリアル ポートを開きます。
フロー制御だけでなく、パリティも無効になっています。バイトサイズは 8 に設定されています。
編集:尋ねられたので、これがWindowsのボーレートのコードです(メモリから)SP.DCBlength = sizeof(SP); SP.BaudRate = 19200; SP.Parity = NOPARITY; SP.StopBits = ONESTOPBIT; SetCommState(hSerial, &SP);
繰り返しますが、これらの機能はすべて問題なく実行されます。
さて、私に大きな頭痛の種を与えているテストケースについて。
Linux ホストで、256 バイト サイズのバイト バッファーを作成します。このバッファは 0 から 255 までの文字値で満たされます...そして、書き込みでネットワーク経由で送信されます。同時に、相手側は「ReadFile」でデータが到着するのを待っています。
この構成では、「他の Linux ホスト」と Windows ホストの両方で 256 バイトが到着します...ただし、0 ~ 255 の数字ではなく、00 06 などです。
実際に必要なオプションを設定する前に、termios 構造体のすべてのメンバーを 0 に設定すると、Linuxhost を機能させることができます。たぶん、制御文字が原因だと思いますが、そうすると、Windows ホストは 256 バイトのうち 4 つしか受け取りません。
私が言ったように、残念ながら私はコードを手元に持っていません。どの時点からこれに取り組むことができるか誰かが知っていれば、とても感謝しています. 再びアクセスできるようになったら、さらにコードを投稿します。
読み取り操作の実装方法:
タイムアウトを設定しましたが、正確な値を思い出せません。
編集:職場に再びアクセスできるようになったので、実際の(現在の)コードを次に示します。
}
実際の送受信コードは次のとおりです。
}
オシロスコープに関しては、送信で両方向をテストしました。どちらも非常に見事に仕事をしました。
0x55 の信号は、50 マイクロ秒の長さで一定の Up/Down です (当然のことながら、ボーレートの設定も問題ありません)。
私の「受信」コードに間違っているものはありますか?「選択」は間違っていますか?
c - 100 ボー レートでのシリアル ポートの処理
シリアル ポートから 100 ボー レートで読み取ることができるかどうかを知りたいです。ボーレートtermio.h
として100を設定する規定はありません。私はLinuxで働いています。相手側の通信デバイスは 100 ボーレートでデータを送信しており、固定されています。ボーレートが 110 に設定されているかどうかを知りたいのですが、受信しているデータが正しいことは保証されますか? またはこれに対する解決策はありますか?
よろしくお願いします。
linux - Linux でカスタム ボー レートを設定するにはどうすればよいですか?
Linux のシリアル ポートを介して、 で定義されていない非標準ボー レートのデバイスと通信したいと考えていtermios.h
ます。
この投稿の「ボーレートエイリアシング」方法を試しましたが、Cプログラム(「testprogram」と名付けました)を実行すると、Linuxは次のように言います"testprogram sets custom speed on ttyS0. This is deprecated."
Google で検索したところ、ボーレートを非標準値に変更する別の (新しい?) 方法があるようです: On http://sourceware.org/ml/libc-help/2009-06 /msg00016.html著者は、c_flag
のstruct termios
は と OR する必要があると言っていBOTHER (=CBAUDEX | B0)
ます。
この方法では、ボー レートは のc_ispeed
およびc_ospeed
メンバに直接設定されstruct termios
ます。ただし、C プログラムでこのメソッドを使用する方法がわかりません。著者が言ったようBOTHER
に、 を含めると定義済み/利用可能はありませtermios.h
ん。このようにボーレートを設定するにはどうすればよいですか?
カーネルを変更せずにボーレートを非標準値に設定するにはどうすればよいですか?
embedded - 9600 ボー シリアルで 32KB を送信する時間はありますか?
ここでの私の計算が正しいかどうか疑問に思っています。ボーレートが 9600 の場合、毎秒 9600 ビットが送信されるということですよね? その場合、次のようになります。
したがって、32KB の送信には次の時間が必要です。
あれは正しいですか?
serial-port - pl2303conectorおよびserialstream.h/libserialによるubuntuでのbuadレートの設定エラー
Ubuntuでシリアル通信アプリケーションを開発しています。pl2303コンバーターとlibserialを使用しています。
私の問題は、ボーレートを設定できないことです。以下のソースコードを実行した後、エラー状態=2が発生します。
私のソースコードは次のとおりです。
c - Is there a way to get supported baud rates in C?
I have an application talking between the PC and a board with a microcontroller running uCLinux. When I send a message over the /dev/TTYS0
I get it on the PC side, however the message comes across as gibberish. I'm pretty sure that I have a baud rate mismatch of some sort.
On the PC side I'm using the baud rate provided:
On the Linux board side I'm setting the same baud rate in the code:
This worked for me when I was testing a PC (Win 7)->Linux Box (OpenSuse) so I know the theory is sound. Now that I've ported this to my true target (coldfire microcontroller board running uCLinux) I'm getting garbage.
So my first option is to "guess and check" at various baud rates to see if I can find one that will work, but rather than that I'd like to programmatically find a way to identify the supported baud rates of a specific target.
I'm sure there's some API, but I haven't found one. Ideas?
EDIT: Seems it's possible to get max baud rate on Windows with the COMMPROP structure. Does anything even like this exist on Linux?
c - Why are the input and output baud rates always the same?
I've got a simple program setting the baud rate for a serial (RS232) port. I'm setting the input and output rates independently using the cfsetospeed()
and cfsetispeed()
functions. As per the man page, this should be possible provided I use these functions and an appropriate constant:
cfsetispeed() sets the input baud rate stored in the termios structure to speed, which must be specified as one of the Bnnn constants listed above for cfsetospeed(). If the input baud rate is set to zero, the input baud rate will be equal to the output baud rate.
cfsetospeed() sets the output baud rate stored in the termios structure pointed to by termios_p to speed, which must be one of these constants:
...
B600
...
B19200
My issue here is that whatever I set second (input or output) seems to be the final value for both. I'm trying to set two independent speeds.
CODE:
My getBRate()
function is just a simple (ugly) switch to return a string version of the baud rate:
The output here will be:
If I reverse the two "set" lines like so:
My output will change to:
Any ideas?
EDIT:
Since the question came up, this code will be run on a board using a Coldfire 528X (either 5280 or 5282). Regardless, the RX and TX should be able to have different rates as per the reference manual for the UART:
23.3.4 UART Clock Select Registers (UCSRn)
The UCSRs select an external clock on the DTIN input (divided by 1 or 16) or a prescaled internal bus clock as the clocking source for the transmitter and receiver. See Section 23.4.1, “Transmitter/Receiver Clock Source.” The transmitter and receiver can use different clock sources.
android - android bluetoothはボーレートを取得します
こんにちは、現在、Bluetooth で作業しているプロジェクトに取り組んでいます。
私が話しているデバイスには、いくつかの異なるモードがあります。これらの各モードは、異なるボー レートを使用します。
このプロジェクトでは、Bluetooth チャットの例を使用しました。
私の問題は次のとおりです
これらのデバイスの各リターンは、異なる終了文字列を返します。("\r\n" , "\r")
デバイスがどのモードにあるかを知ることができるようにしたいと考えています。私が考えることができる最善の方法は、デバイスが現在どのボーレートにあるかを確認することです。接続から情報を見つける方法はありますか?
c# - serialport.open() 使用時の I/O 例外エラー
最終更新
それはずっと私たちのファームウェアでした。ある程度恥ずかしいことですが、前進できることをうれしく思います。Java の学習は別の日に延期できます。私の答えは以下です。
アップデート
だから私は多かれ少なかれこれをあきらめました。API にまで及ぶバグだと思いますが、その原因を究明するための時間もリソースもスキルセットもありません。Windowsが中指を立てるだけのハードウェアがいくつかあると思います。Eclipse をダウンロードし、Java に切り替えました。それが機能するかどうかを確認します。そうでない場合は、ここでまた会いましょう。しかし、私は絶対にこれを解決したいと思っているので、誰かがこれを深く掘り下げる時間や傾向がある場合は、あなたが思いついたものを見てみたい. もちろん、私は時々ここに戻ってきます。アラートが表示されるように、コメントで「@」を付けてください。
元の投稿
この問題に対処している人が他にも何人かいることは知っていますが、誰かが私を助けてくれることを望んでいました. COM ポートに接続しようとしていますが、次のserialport.Open()
コマンドを使用しようとすると I/O 例外が発生します。
COM ポートをエミュレートするために Stellaris LM4F232 を使用しています。Termite (端末プログラム) を使用して開いたり、アクセスしたり、良い結果を得ることができますが、Visual Studio を使用しようとすると接続すらできず、このエラーが発生します。今では、このエラーが何を意味するのかさえよくわかりません。他の場所で読み込もうとしても、まだ道に迷っています。
ここで何が起こっているのか誰か説明してもらえますか? もっと多くのコードを含めることができますが、正直なところ、それほど多くはありません。シリアル ポート デバイスのすべてのプロパティは正常であり、このデバイスでのみ発生しています (同じ詳細で問題なく MSP430 を使用できます)。
見たい人のために、私のコードを以下に示します(これは単なる「サンドボックス」であり、実際のプログラムではありませんが、症状は同じです):
その他の設定はプロパティ マネージャーで行います (唯一の違いは、ボーが 230400 に設定されていることです。他のすべての設定はデフォルトです)。これ (MSP430) を使用して COM4 を開くことができます。これは、すべての意図と目的において同一のデバイスです。COM5 は Termite で開くことができるので、接続が良好であることはわかっています)。いいえ、同時に開こうとしているわけではありません。さらに情報が必要な場合はお知らせください。さらに投稿できます。
編集:私はこれを理解しようとして3日目ですが、まだ運がありません。私が見る限り、まったく違いがないのに、なぜ自分のCOMポートではなくターミナルプログラムを介してこのCOMポートにアクセスできるのか、私にはよくわかりません。COMポートを「調べて」そのプロパティを確認できるプログラムはありますか(Windowsマネージャー以外に)?私はかなりイライラしており、これを理解するまでプロジェクトで立ち止まっているようなものです...
EDIT2: 明らかな回避策を見つけましたが、まだここで機能させるには至っていません。現在、いくつかの異なる I/O エラーが発生していますが、少なくともモーションです (進行中かどうかはわかりません)。また、これは .NET のバグであり、2.0 から存在していることもわかりました。私はまだ何か助けが欲しいのですが、私がそれを理解したら、私は戻って報告します. Zach のコード (上にリンクされている回避策) を以下に示します。
EDIT3: 6 日目: 私はまだこれに取り組んでいます。水の配給は少ないですが、それでも頑張っています。助けは確実に間近に迫っているに違いないと感じています。この日誌を見つけた人は誰でも私の遺体をカナダに持ち帰り、ニコールを見つけてください。私が彼女を愛していると彼女に伝えてください。
しかし、真剣に、何がこの問題を引き起こしているのかわかりません。純粋に組み込み側にあるのだろうかと思います。おそらく、USB On-The-Go (OTG) であるか、デバイスがホストにもなることができるためです。誰かがその問題に遭遇しましたか? ただし、Termite (参加したばかりの視聴者向けの端末プログラム) を使用できる理由については説明していません。私は、a) 動作し、b) a) を参照できるオープン ソース ターミナル プログラムを見つけようとしています。いつものように、2006 年にさかのぼってこの問題が発生したと思われるフォーラムを無数に見つけたので、ここで問題を発見したら報告します。
EDIT4:与えられたアドバイスに従って、ポート監視ソフトウェアアプリケーションをダウンロードしました(Eltima Serial Port Monitorを入手しました)、ボーの問題のように見えます:
しかし、奇妙なことに、どのボーを設定しても失敗します。また、誰かがアップ/ダウンの意味を説明できますか? ググってみましたが、キーワードが一般的すぎます。いつものように、私は変更を報告し続けます。
また、記録のために、115200 ボー (Termite と同じ) で Eltima を使用して接続できます。残念ながら、これは Visual Studio では機能しません。
EDIT5: 私たちの筋書きは意外なひねりを加えています。シロアリが問題の COM ポートに接続したときに何が起こるかを監視していて、BLAM! シロアリは私のプログラムとまったく同じエラーをスローしますが、無視します。天才ですね。ずさんですが、うまくいきます。ここで、IOExceptions を無視する方法を学ぶ必要があります。判明したらまた報告します。
EDIT6:ボーレートの問題であることが判明しましたが、さらに深くなります。Eltima Serial Port Monitoring ソフトウェアを使用していますが、非常に直感的で使いやすいです。私はそれをお勧めします。調査の結果、この例外を無視することはできず、.NET のライブラリを使用してシリアル ポートに接続できないことがわかりました。
そのため、Win32 API をさらに深く掘り下げ、独自の API を作成する必要があります。これに触れているページをいくつか見つけましたが、正直なところ、このようなことはこれまでに行ったことがありません。この問題に苦しんでいる人が多すぎます。
まったく同じ症状が見られるフォーラムや Web サイトをかなり見つけましたが、「ああ、.NET は最悪だ」と言う以外に実際に多くのことを行った人は誰もいません。私は完全な静的ライブラリ クラスを作成し、自分の Web サイト、ここ、およびその他の場所で公開する予定です。うまくいけば、.NET が気付くでしょう (このバグは 2.0 から存在しています)。
linux - Linux で cfsetispeed と tcsetattr コマンドを使用して、ポートのボーレートを 9600 に設定する方法を教えてください。
現在、次のコードを使用していますが、どこが間違っているのか疑問に思っています。