問題タブ [tcomport]
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.
delphi - Delphi のスレッドからシリアル ポート コンポーネント TComPort (v4) でイベントを使用しますか?
数年前、私のアプリケーションの 1 つで、特定のアプリが特定のシリアル イベントに非常に迅速に応答しなければならなかったときに、シリアル処理をスレッドに移動しました。
それはBDS2006にあり、古いバージョン(3.xくらい?)で、tthread.executeに次のようなコードを入れることで行われました。
初期化は次のようでした
rxchar メソッドは、comport1.readstr() を使用して読み取ります
私は最近これを掘り下げる必要があり、tcomport4 を備えた私の Delphi XE では機能しないことに気付きました。ソースを見ると、comport4 が内部スレッド (「オーバーラップ」プロパティ) を処理する方法を変更したというコメントがありましたが、デフォルトは「true」のようで、「クラシック」というコメントがあり、私は
それは古いバージョンとの互換性を意味すると仮定しました。
プロトコルはバイナリであり、すべての string,char<-> ansistring,ansichar の変更は、通常のメインスレッド バージョンで行ったように行われていることに注意してください。
今、本当の質問:
- スレッドで tcomport4 を使用している人はいますか?
- 上記に明らかな間違いはありますか?
- または、別のコンポーネントに移行する必要がありますか?
私はまだ何が起こっているのかをデバッグしていますが、急いでいます.
アップデート
古いターボ Delphi コピーを再インストールし、v3 で動作することを確認しました。コードパスの小さなバグを修正しましたが、思っていたものとは少し異なりました (上記のコードではありません)。
これにより、dxe/comportv4 と bds2006/comportv3 の間の動作をより適切に説明できます。v4 コードは、はるかに多くの読み取りイベント (数百/秒) を生成します。読み取りは、受信キューなどから読み取り文字を削除しないようです。
更新 2
私は最新バージョンで簡単なテストを行い、必要な再配置を行いました (基本的にバイナリ プロトコルの文字列関数の使用を終了します)。アプリケーションが起動時にクラッシュしたため、しばらく動けなくなりましたが、それは私が gnugettext を使用しており、Comport が別の (Unicode ではない?) バージョンをパッケージ化しているためです。しかし、その後は機能します。
残念ながら、この変更を製品バージョン (完全に記述されたプロトコル デコード) に反映するには少しリスクが高いため、中間バージョン (4.0 と 4.11f の間) でテストする必要があります。そのうちにそれを行いますが、どのバージョンが最後の readstr(ansistring) であったかについて何か提案はありますか?
アップデート 3
結局、私は単純に 4.11f ユニットの名前を変更し、それらを古いバージョンと並行して使用し、スレッド コードベースには 4.11f を使用し、既存のコードを維持するために古いバージョンを使用しました。
長期的には、単純に waitforevent コードを使用して独自のバージョンを作成するかもしれません。それに関する主な問題は、待機がタイムアウト、停止イベントなどで終了したかどうかを確認できないことです。これは、たとえば定期的に送信したい場合は、別のタイマーが必要であることを意味します。
delphi - TComPort の動作がおかしい
コンポーネントが正常に動作する AT コマンドを使用して制御する SMS ゲートウェイがありますが、デバイスから受信した文字列を正確に解析できません。
まず第一に、私はハードウェアのフロー制御を使用していますが、それがどのように影響するのでしょうか?
TComDataPacket コンポーネントを使用しています。イベント onPacket() があり、デバッガーを使用すると文字列を受信します。文字列は正常に表示されますが、pos() を使用して検索するか、ShowMessage() を使用して文字列を表示すると、文字列は非常に短くなります。 #00が見えない
RxChar イベントを使用してみましたが、トリガーされず、RxBuf でアクセス違反が発生します。
私は Delphi XE 2 を使用していますが、コンポーネントに問題があるのでしょうか、それとも私が何か間違ったことをしているのですか?
LE : メソッドの最後にスリープを挿入しないと、イベント onPacket() がフリーズします。コードは次のとおりです。
delphi - 別の形式でRxCharComPortを使用する方法
デルファイコードに問題があります...コードがあります:
メインフォーム
子供のフォーム:
デバイスからメモに入力したデータを子形式で表示したい。comportコンポーネントをメインフォームに配置します。しかし、私がプログラムを実行すると、次のように表示されます。
Project Data.exeは、モジュール'Data.exe'のアドレス00466051でメッセージ'アクセス違反を伴う例外クラスEAccessViolationを発生させました。アドレス000002F8'の読み取り。プロセスが停止しました。ステップまたは実行を使用して続行します。
どうすれば問題を解決できますか?
windows - TDataPacket と TComPort は、パケットを受信するまで待機します
私はecrソフトウェアに取り組んでいます。
このソフトウェアは、com ポートを持つハードウェアと通信します。
Delphi でプログラミングしており、TComPort と TDataPacket コンポーネントを使用しています。
問題があります (tdatapacket がどのように機能するかを理解していないと思います)。
レシートを印刷するには、プロトコル ルールによってフォーマットされた文字列をハードウェアに送信する必要があります。
印刷のプロトコルは次のとおりです。
私:ENQ
ハードウェア: 確認
私: STX + 文字列 + チェックサム (文字列) + ETX
ハードウェア: 確認
私: STX + 文字列 + チェックサム (文字列) + ETX (終了文字列)
HW: ACK とレシートの印刷
私はこのコードを書きました:
パケットイベントのデータパケットでは、次のようになります。
しかし、ack の値を出力しようとすると、常に空の文字列が表示されます。何が間違っているのでしょうか?
delphi - ComDataPacket.OnPacket 内の UI コントロールにアクセスするにはスレッド同期が必要ですか?
フォームに と がありComPort1
ます。私はプロパティがあることを確認し、スレッドを作成すると推測します。ComDataPacket1
ComDataPacket1.ComPort:= ComPort1;
SyncMethod
TComPort
ComPort1.Connected:=true;
OnExecute
最近、Indy コンポーネントのイベントからのすべての UI アクセスIdTCPServer
を MainThread と同期する必要があることに気付きましたが、それは TComPort にも当てはまりますか? これを行う方法(インディにはこれを行うためのクラスがあります)?
私はこのようにcomポートからデータを読んでいます(データはパケットとして送信されるのでComDataPacket1
非常に便利です):
私はプロジェクトに取り組んでおり、「あなたのアプリケーションは動作を停止しました」というメッセージボックス(プログラムが閉じられたとき)で有名になることがあります。このエラーが原因ではないかと思います。
delphi - Delphi dll で tcomport を使用するとエラーが発生する
私は小さなdllに取り組んでおり、それにTComportコンポーネントを使用しています。このdllには、いくつかのパラメーターを取り、文字を返す関数があります。プロジェクトに Datamodule を追加し、TComport と TComDataPacket を配置します。すべてうまくいきますが、TComport はイベントをキャッチできません。たとえば、TComDataPacket コンポーネントの OnPacket イベントでデバイスから文字列を取得したいとします。私の悪い英語についてお詫び申し上げます。
delphi - 読み取り文字列の読み込み
シリアル回線 RS232 でホストから単純な文字列を読み取ろうとしています。受信 - 送信のパラメーターは両方で同じです。
私はこの文字列を送信しようとしました:
!A243B324C213D300#
私が使う '!' およびヘッダーとして「#」を使用して、文字列が完全に受信されるようにします。問題は、文字列を 15 文字目まで受信できることです (3)。
このコードを使用すると、次のことがわかります。
見ます
!A243B324C213D3
00#
コンポートのバッファを拡張しようとしましたが、結果はありませんでした。
では、なぜ一発で完全な文字列を受信できないのでしょうか?
ここでこのライブラリを見つけましたが、今までは問題なく動作しています:
delphi - DelphiでTmemoの最後の行を読む
非常に長い間試した後....助けを求めることにしました。
Delphi で Tmemo に送信された最後の行を読み取ろうとしています。コード行を 1 行ずつ開発者に送信しています。開発に乗り込みます。ボードは毎回異なるコード行を送信する必要があります。私の最終目標は、開発者の最後の行を読み返すことです。ボードが返送します。
例えば
ATT = 7 に設定 --->> \dev に送信。ボード
開発者 ボードの返信
OK <----- \ 開発者から受け取りました。ボード
次のコード行を送信します。
または
エラー
「set att = 7」コマンドを再度送信します。
これまでのところ、作業に必要なものはほとんど揃っています。Delphi に tmemo の最後の行を読み取らせることができません。
私が試してみました
showmessage は、私自身の参照用にのみ存在します...受信したデータを参照用にバウンスしていることはわかっています。
奇妙なことは、それが時々機能することです。カウントは時々文字を跳ね返すので、私はこれを完全に間違った方法で行っていると思います...