1


0

Windows CE 6.0用の.net compact 2.0のdataReceivedイベントは、シリアル通信で1回しか機能しません。

シリアルポートを読み取り、入力した文字をエコーバックする単純なシリアルポートプログラムがあります。 タイマーで受信したシリアルをポーリングすることでこれを正常に動作させることができますが、代わりにdataReceivedイベントを使用したいと思います。 何らかの理由で、イベントは一度発生しますが、二度と発生しません。

    SerialPort bsp;
    public Form1()
    {
        InitializeComponent();
        bsp = new SerialPort("COM2", 2400, Parity.None, 8, StopBits.One);
        bsp.DataReceived +=new SerialDataReceivedEventHandler(whasup);
        System.Threading.Thread.Sleep(1000);
        bsp.Open();
    }
    void whasup(object sender, SerialDataReceivedEventArgs e)
    {
        char[] text = new char[100];
        int temp = bsp.BytesToRead;
        string j = temp.ToString();
        bsp.Read(text, 0, temp);
        bsp.Write(text, 0, temp);
    }

私はこれをPCに移植してみましたが、うまく動作しますが、このWindows CEデバイスでは、本当に協力したくありません。 受信データのエコーバックを停止した後でも、Win CEデバイスからテキストを吐き出すタイマーを実行したため、シリアルオブジェクトがまだ開いていることがわかります。 また、タイマー出力bsp.BytesToReadがあり、Windows CEデバイスとシリアルに通信するPCでさらにキーを入力すると、その値が上昇することがわかりました。 私は何かが足りないのですか?

1 Answer


0


`Read()`で同様の問題が発生しましたが、代わりに `ReadExisting()`で管理し、常にバッファー全体を読み取りました。 次のイベントを発生させることができるのは、この事実かもしれません。

最初のバイトがバッファに書き込まれるとすぐにイベントが発生するため、 `Sleep(500)`が含まれていました。 試行錯誤を繰り返し、読んでいたメッセージが特定の長さを決して超えないという知識の中で、イベントの500ミリ秒以内に(そして実際にはずっと前に)完全に書き込まれることを知りました。

少しヒット/ミスし、シリアルの専門家からの「正しい」ソリューションを見て喜んでいます!

コード:

private SerialPort port;
private object readLock = new object();

private SerialManager()
{
    port = new SerialPort(SerialPort, BaudRate, Parity.None, 8, StopBits.One);
    port.Handshake = Handshake.None;
    port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
    port.Open();
}

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // Lock to subsequent DataReceived events
    lock (readLock)
    {
        Thread.Sleep(500);
        string data = port.ReadExisting();
    }
}