問題タブ [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.

0 投票する
1 に答える
6232 参照

delphi - Delphi のスレッドからシリアル ポート コンポーネント TComPort (v4) でイベントを使用しますか?

数年前、私のアプリケーションの 1 つで、特定のアプリが特定のシリアル イベントに非常に迅速に応答しなければならなかったときに、シリアル処理をスレッドに移動しました。

それはBDS2006にあり、古いバージョン(3.xくらい?)で、tthread.executeに次のようなコードを入れることで行われました。

初期化は次のようでした

rxchar メソッドは、comport1.readstr() を使用して読み取ります

私は最近これを掘り下げる必要があり、tcomport4 を備えた私の Delphi XE では機能しないことに気付きました。ソースを見ると、comport4 が内部スレッド (「オーバーラップ」プロパティ) を処理する方法を変更したというコメントがありましたが、デフォルトは「true」のようで、「クラシック」というコメントがあり、私は

それは古いバージョンとの互換性を意味すると仮定しました。

プロトコルはバイナリであり、すべての string,char<-> ansistring,ansichar の変更は、通常のメインスレッド バージョンで行ったように行われていることに注意してください。

今、本当の質問:

  1. スレッドで tcomport4 を使用している人はいますか?
  2. 上記に明らかな間違いはありますか?
  3. または、別のコンポーネントに移行する必要がありますか?

私はまだ何が起こっているのかをデバッグしていますが、急いでいます.

アップデート

古いターボ Delphi コピーを再インストールし、v3 で動作することを確認しました。コードパスの小さなバグを修正しましたが、思っていたものとは少し異なりました (上記のコードではありません)。

これにより、dxe/comportv4 と bds2006/comportv3 の間の動作をより適切に説明できます。v4 コードは、はるかに多くの読み取りイベント (数百/秒) を生成します。読み取りは、受信キューなどから読み取り文字を削除しないようです。

更新 2

私は最新バージョンで簡単なテストを行い、必要な再配置を行いました (基本的にバイナリ プロトコルの文字列関数の使用を終了します)。アプリケーションが起動時にクラッシュしたため、しばらく動けなくなりましたが、それは私が gnugettext を使用しており、Comport が別の (Unicode ではない?) バージョンをパッケージ化しているためです。しかし、その後は機能します。

残念ながら、この変更を製品バージョン (完全に記述されたプロトコル デコード) に反映するには少しリスクが高いため、中間バージョン (4.0 と 4.11f の間) でテストする必要があります。そのうちにそれを行いますが、どのバージョンが最後の readstr(ansistring) であったかについて何か提案はありますか?

アップデート 3

結局、私は単純に 4.11f ユニットの名前を変更し、それらを古いバージョンと並行して使用し、スレッド コードベースには 4.11f を使用し、既存のコードを維持するために古いバージョンを使用しました。

長期的には、単純に waitforevent コードを使用して独自のバージョンを作成するかもしれません。それに関する主な問題は、待機がタイムアウト、停止イベントなどで終了したかどうかを確認できないことです。これは、たとえば定期的に送信したい場合は、別のタイマーが必要であることを意味します。

0 投票する
1 に答える
753 参照

delphi - TComPort の動作がおかしい

コンポーネントが正常に動作する AT コマンドを使用して制御する SMS ゲートウェイがありますが、デバイスから受信した文字列を正確に解析できません。

まず第一に、私はハードウェアのフロー制御を使用していますが、それがどのように影響するのでしょうか?

TComDataPacket コンポーネントを使用しています。イベント onPacket() があり、デバッガーを使用すると文字列を受信します。文字列は正常に表示されますが、pos() を使用して検索するか、ShowMessage() を使用して文字列を表示すると、文字列は非常に短くなります。 #00が見えない

RxChar イベントを使用してみましたが、トリガーされず、RxBuf でアクセス違反が発生します。

私は Delphi XE 2 を使用していますが、コンポーネントに問題があるのでしょうか、それとも私が何か間違ったことをしているのですか?

LE : メソッドの最後にスリープを挿入しないと、イベント onPacket() がフリーズします。コードは次のとおりです。

0 投票する
1 に答える
4354 参照

delphi - 別の形式でRxCharComPortを使用する方法

デルファイコードに問題があります...コードがあります:

メインフォーム

子供のフォーム:

デバイスからメモに入力したデータを子形式で表示したい。comportコンポーネントをメインフォームに配置します。しかし、私がプログラムを実行すると、次のように表示されます。

Project Data.exeは、モジュール'Data.exe'のアドレス00466051でメッセージ'アクセス違反を伴う例外クラスEAccessViolationを発生させました。アドレス000002F8'の読み取り。プロセスが停止しました。ステップまたは実行を使用して続行します。

どうすれば問題を解決できますか?

0 投票する
1 に答える
877 参照

windows - TDataPacket と TComPort は、パケットを受信するまで待機します

私はecrソフトウェアに取り組んでいます。

このソフトウェアは、com ポートを持つハードウェアと通信します。

Delphi でプログラミングしており、TComPort と TDataPacket コンポーネントを使用しています。

問題があります (tdatapacket がどのように機能するかを理解していないと思います)。

レシートを印刷するには、プロトコル ルールによってフォーマットされた文字列をハードウェアに送信する必要があります。

印刷のプロトコルは次のとおりです。

私:ENQ

ハードウェア: 確認

私: STX + 文字列 + チェックサム (文字列) + ETX

ハードウェア: 確認

私: STX + 文字列 + チェックサム (文字列) + ETX (終了文字列)

HW: ACK とレシートの印刷

私はこのコードを書きました:

パケットイベントのデータパケットでは、次のようになります。

しかし、ack の値を出力しようとすると、常に空の文字列が表示されます。何が間違っているのでしょうか?

0 投票する
0 に答える
709 参照

delphi - ComDataPacket.OnPacket 内の UI コントロールにアクセスするにはスレッド同期が必要ですか?

フォームに と がありComPort1ます。私はプロパティがあることを確認し、スレッドを作成すると推測します。ComDataPacket1ComDataPacket1.ComPort:= ComPort1;SyncMethodTComPortComPort1.Connected:=true;

OnExecute最近、Indy コンポーネントのイベントからのすべての UI アクセスIdTCPServerを MainThread と同期する必要があることに気付きましたが、それは TComPort にも当てはまりますか? これを行う方法(インディにはこれを行うためのクラスがあります)?

私はこのようにcomポートからデータを読んでいます(データはパケットとして送信されるのでComDataPacket1非常に便利です):

私はプロジェクトに取り組んでおり、「あなたのアプリケーションは動作を停止しました」というメッセージボックス(プログラムが閉じられたとき)で有名になることがあります。このエラーが原因ではないかと思います。

0 投票する
1 に答える
1406 参照

delphi - Delphi dll で tcomport を使用するとエラーが発生する

私は小さなdllに取り組んでおり、それにTComportコンポーネントを使用しています。このdllには、いくつかのパラメーターを取り、文字を返す関数があります。プロジェクトに Datamodule を追加し、TComport と TComDataPacket を配置します。すべてうまくいきますが、TComport はイベントをキャッチできません。たとえば、TComDataPacket コンポーネントの OnPacket イベントでデバイスから文字列を取得したいとします。私の悪い英語についてお詫び申し上げます。

0 投票する
2 に答える
10042 参照

delphi - 読み取り文字列の読み込み

シリアル回線 RS232 でホストから単純な文字列を読み取ろうとしています。受信 - 送信のパラメーターは両方で同じです。

私はこの文字列を送信しようとしました:

!A243B324C213D300#

私が使う '!' およびヘッダーとして「#」を使用して、文字列が完全に受信されるようにします。問題は、文字列を 15 文字目まで受信できることです (3)。

このコードを使用すると、次のことがわかります。

見ます


!A243B324C213D3

00#


コンポートのバッファを拡張しようとしましたが、結果はありませんでした。

では、なぜ一発で完全な文字列を受信できないのでしょうか?

ここでこのライブラリを見つけましたが、今までは問題なく動作しています:

http://sourceforge.net/projects/comport/

0 投票する
1 に答える
2376 参照

delphi - DelphiでTmemoの最後の行を読む

非常に長い間試した後....助けを求めることにしました。

Delphi で Tmemo に送信された最後の行を読み取ろうとしています。コード行を 1 行ずつ開発者に送信しています。開発に乗り込みます。ボードは毎回異なるコード行を送信する必要があります。私の最終目標は、開発者の最後の行を読み返すことです。ボードが返送します。

例えば

ATT = 7 に設定 --->> \dev に送信。ボード

開発者 ボードの返信

OK <----- \ 開発者から受け取りました。ボード

次のコード行を送信します。

または

エラー

「set att = 7」コマンドを再度送信します。


これまでのところ、作業に必要なものはほとんど揃っています。Delphi に tmemo の最後の行を読み取らせることができません。

私が試してみました

showmessage は、私自身の参照用にのみ存在します...受信したデータを参照用にバウンスしていることはわかっています。

奇妙なことは、それが時々機能することです。カウントは時々文字を跳ね返すので、私はこれを完全に間違った方法で行っていると思います...