.純シリアルポートの助けを必要していること、受信したデータを複数の"パケット"

StackOverflow https://stackoverflow.com/questions/891475

  •  23-08-2019
  •  | 
  •  

質問

私は非常に新しい送信データをシリアルポート。純やっ導入後のTCPの相手とかいやすいシリアルナンバー!

その上、ほぼ思いシリアル双方向通信の実施いんに行われたもの-

  1. 私の読み込みが複数メッセージを受けたとして分断された応答のCOMポートとどうなるかはわからない設定いる必要があり、どうやって、コードを書く違ったので修正します。何が原因か。私は検査のメッセージでにブレークポイント SerialPort_DataReceived.

基本的にデータを送信してい:

01: LS|DA090521|TI111043|q
02: PS|RN102|PTC|TA1040000|P#0|DA090521|TI111429|j

がで分割(ランダムに位置れたもので読む)

01: LS|DA090521|TI111
02: 043|q
03: PS|RN102|PTC|TA1
04: 0000|P#0|DA090521|TI111429|j

-質問1の回答は、クリスW.ます。私のメッセージに期待してい建設されてからの断片を漸進的に見出STX,{msg体},ETX)およびそのアクションを行った際のメッセージは完全に内蔵、もっとドキュー、大変嬉しく思っています。

.2.を得ていますが"|"のシンボルを読みのほぼすべてのサイクルは、これによりコマンドしてい設定に誤りがなんとから、案件のシリアル通信違いによるものなのか、それともこのデバイスは送信すか?(私はそうは思いませんが、ハイパーターミナルの接続性がこのキャラクターが送信されてこないます。)

.3.きすることを確認してくださいデータの読み出しと書き込みを正しくは、それぞれの方法。

さうに、私は他の二つの質問です。

関連するコードとして

...
    //                          COM3,    9600,     None,   8,        One
    SerialPort = new SerialPort(comPort, baudRate, parity, dataBits, stopBits);
    if (SerialPort.IsOpen) SerialPort.Close();
    // SerialPort.RtsEnable = true; // Request-to-send
    // SerialPort.DtrEnable = true; // Data-terminal-ready
    SerialPort.ReadTimeout = 150; // tried this, but didn't help
    SerialPort.WriteTimeout = 150; // tried this, but didn't help
    SerialPort.Open();

    SerialPort.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived);
}

void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // Process received data
    SerialPort sp = (SerialPort)sender;
    byte[] buffer = new byte[sp.BytesToRead];
    int bytesRead = sp.Read(buffer, 0, buffer.Length);

    // message has successfully been received
    message = Encoding.ASCII.GetString(buffer, 0, bytesRead);
}

public bool SendMessage(string text)
{
    // Only send message if a client is connected
    if (SerialPort != null && SerialPort.IsOpen)
    {
        byte[] buffer = Encoding.ASCII.GetBytes(text);
        SerialPort.Write(buffer, 0, buffer.Length);
    }
}
役に立ちましたか?

解決

  

私は、複数のメッセージにまたがって分割されている読み込み

これは必然的な行動、期待、正常です。それだけでなく、データオーバーTCPで発生することができます。シリアルインターフェイスには、単なるバイトの無限ストリームです。これは、パケットにこれらのバイトを再パッケージ化し、アプリケーションの責任です。

は、パケット境界の位置が重要な場合は、パケット境界が受信したデータを見てから、ことになっている場所を伝えることができない場合、その後、あなたはEMを<ように、データの形式を再考する必要があるかもしれませんパケット境界がどこにあるか> の言うことができます。

  「|」

私が受けています私の読み取りによるシンボルほぼすべてのサイクル

その文字の進値とは何ですか? Handshakeプロパティを設定するとXOnXOffまたはRequestToSendXOnXOffは、状況を改善するかどうかを確認します。

他のヒント

は、下位レベルのシリアルポートがイベントを受信したデータをトリガするときに決定することができます。それは「完全な」パケットが到着する前にそれを行うことを決定するかもしれません。あなたが期待するデータセット内のターミネータ文字を持っているようしかし、それが見えます。あなたが行うことができますもしそうなら、次の(私は、構文の混乱を避けるために、あなたのSERIALPORTの割り当てを変更した注意します:

        p = new SerialPort(PortName, BaudRate, Prty, DataBits, SBits);
        p.NewLine = Terminator;

ターミネーターは、あなたの終端文字(複数可)を含む文字列です。 (それが適用される場合とSerialPort.WriteLine())その後、SerialPort.ReadLine()を使用することができます。これは、少なくとも、あなたの最初の問題に役立つことがあります。

そして、多くのWin32シリアルポートプログラミングが少しだけます。純で、私の助言を受け、結晶粒の塩です。

私の読み込みが複数メッセージを受けたとして分断された応答のCOMポートとどうなるかはわからない設定いる必要があり、どうやって、コードを書く違ったので修正します。

としてその他っているため、これは完全に正常です。によってどのような機器はDCE側は、ついに再包装す。お使いいただくことによって機器の種類だけを接続でできないと思います。

そのためには、より多くのデータで次のことを試してみてください:

  • を調整します。Int32ReceivedBytesThreshold物件
  • を同期I/Oを指定する固定した数のバッファへのオフセットよりもさらにイベント受付

を得ていますが"|"のシンボルを読みのほぼすべてのサイクルは、 これによりコマンドで設定していま 間違ってなんだか、案件のシリアル 通信違いによるものなのか、それとも、デバイス 送信すか?(私はそうは思わない ものとしてハイパーターミナル接続 明らかにこの文字はない 送られます。)

いつかのライン、チェックアウト PortMonからSysInternals, 無料アプリと覗おcomポートを使ってデータ転送をする。その技術がって、すぐにIRP_MJ_WRITEとIRP_MJ_READコマンドのラインきの長さをバイト単位のデータ送信される。この対応することができるでしょうかそれでも問題が改善しない場合はできます。純SerialPortオブジェクトまたはデバイスが実際に送信"|"のライン。

できる確認をさせていただいたうえで私は読み 文書データを正確に それぞれの方法。

で適切なため、さらにイベントの受信方法。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top