0

Enfora モデムと通信するには、シリアル ポートにコマンドを送信する必要があります。すべてのコマンドに対して応答が返されますが、応答文字列の長さは異なる場合があります。書き方を知り、それが終わるまで返事を待つ必要があります...

そこで、シリアルポートから読み取り、プログラムが書き込みのみを行うスレッドを作成することを考えました...

スレッド機能

private void thread_Handler()
{
    while(true)
        this.read();
}
private void read()
{
    if (this.rtbMessages.InvokeRequired)
    {
        try
        {
            SetTextCallback d = new SetTextCallback(read);
            this.Invoke(d);
        }
        catch{}
    }
    else
    {
        readBuffer = serialPort.ReadExisting();
        rtbMessages.AppendText(readBuffer);
    }
}

したがって、このスレッドは常にcom PORTから読み取ろうとしており、この方法でメッセージを送信します

writeBuffer = "COMMAND 1";
serialPort.Write(writeBuffer);
writeBuffer = "COMMAND 2";
serialPort.Write(writeBuffer);

ただし、Write() で送信した 2 番目のコマンドから応答がありません... スレッドを削除し、Write() のたびに ReadExisting() を使用しようとしましたが、それも機能しませんでした。

私がそれを機能させる唯一の方法は、追加することでした

System.Threading.Thread.Sleep(1000);

Write を呼び出すたびに、すべての Write() コマンドからすべての応答を取得します...しかし、これを使用したくありません。送信するすべてのコマンドから効果的に書き込み、すべての応答を取得する別の方法を知りたいです。返信文字列の長さや、返信メッセージを受信するのにかかる時間に関係なく.

メッセージの生成を停止する別のコマンドを送信するまで、永遠にメッセージを受信し続けることがあります。

ありがとうございました!

4

2 に答える 2

1

.Net がこれらすべてを行います。

SerialPort を作成し、そのDataReceivedイベントをサブスクライブするだけです。(状況によっては、完全なデータ パケットを組み立てるために、この方法で受信したデータのいくつかのチャンクをつなぎ合わせる必要がある場合があることに注意してください。しかし、それがモデム コマンドからの短い応答である場合は、常に/通常イベントが発生するたびに完全なパケットを取得します。

于 2012-09-06T21:31:55.223 に答える
0

イベントを使用してデータを受信します。

以下は DreamInCode の例です (特定のニーズに合わせてカスタマイズする必要があります)。

/// <summary>
/// This method will be called when there's data waiting in the comport buffer
/// </summary>
void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    //determine the mode the user selected (binary/string)
    switch (CurrentTransmissionType)
    {
        //user chose string
        case TransmissionType.Text:
            //read data waiting in the buffer
            string msg = comPort.ReadExisting();
            //display the data to the user
            DisplayData(MessageType.Incoming, msg + "\n");
            break;
        //user chose binary
        case TransmissionType.Hex:
            //retrieve number of bytes in the buffer
            int bytes = comPort.BytesToRead;
            //create a byte array to hold the awaiting data
            byte[] comBuffer = new byte[bytes];
            //read the data and store it
            comPort.Read(comBuffer, 0, bytes);
            //display the data to the user
            DisplayData(MessageType.Incoming, ByteToHex(comBuffer) + "\n");
            break;
        default:
            //read data waiting in the buffer
            string str = comPort.ReadExisting();
            //display the data to the user
            DisplayData(MessageType.Incoming, str + "\n");
            break;
    }
}

http://www.dreamincode.net/forums/topic/35775-serial-port-communication-in-c%23/

于 2012-09-06T21:29:38.983 に答える