0

で GPRS 接続を確認するスレッドで作業していますCompactFramework

スレッドの考え方は単純です。プログラムが接続されていない場合は、コードを実行して接続します (このコードではエラーが発生します)。接続に問題がない場合は、60 秒後に再度チェックします。

さて、接続コードに焦点を当てます。次のコードは、接続されているかどうかを確認します。接続されていない場合は、DataReceiveイベントにサブスクライブします。

void initFormText()
{
    if (isThereConnect()) //true if it is connected
    {
       //enable timer to recheck if it's connected
    }
    else //it isn't connected
    {  

        serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived);
        if (serialPort1.IsOpen)
        {
            serialPort1.Close();
        }
        serialPort1.Open();   

        timerStep.Enabled = true;
    }    
}  

ここで問題が発生します。serialPort1_DataReceived でデータを確認し、timerStep によってテストされる変数を設定すると、いくつかの手順が実行されます。

問題は DataReceived イベントで発生します。スレッドの外部で次のコードを実行すると、正常に動作し、すべてのジョブを実行して接続を確立します、スレッドでは動作しません。これをいくつか追加してテストしMessageBoxたところ、DataReceive 内のものが表示されないことがわかりました。

void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    byte[] data = new byte[1024];
    int n = serialPort1.Read(data, 0, data.Length);
    string rec = Encoding.GetEncoding("windows-1252").GetString(data, 0, n);

    if (string.IsNullOrEmpty(rec))
    {
        return;
    }

    if (rec.Contains("AT+CIMI") && rec.Contains("OK"))
    {
        MessageBox.Show("serialPort 1");
        currState = 1;
    }
    else if (rec.Contains("READY"))
    {
        MessageBox.Show("serialPort 11");
        currState = 1;
    }
    else if (rec.Contains("0,1") || rec.Contains("0,5"))
    {
        MessageBox.Show("serialPort 2");
        currState = 2;
    }
}

そのため、何らかの理由で serialPort が何も受信しておらず、その理由がわかりません。スレッドの外では機能するが、スレッド内では機能しないという事実は、私を苛立たせています。

助けていただければ幸いです。ありがとうございます!

4

2 に答える 2

1

はい。ただし、イベントが発生する前にスレッドが終了すると思います。次の方法でフォームを作成する必要があります。これはデスクトップ用のコードですが、ここにインストールしていないため、CompactFramework で使用できるものをシミュレートすることに注意してください。最初の Form1 はメイン フォームであり、Form2 であるスレッドを開始します。Form2 には機能しているボタンと Click EventHandler がありますが、Form2 を Application.Run() で表示する必要があります。サンプルコードは次のとおりです。

 public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Thread thread = new Thread(new ThreadStart(ThreadMethod));
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
    }
    void ThreadMethod()
    {
            Form2 f = new Form2();
            Application.Run(f);
    }
}  

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("Something");
    }
}

このようにうまくいくことを願っています。

于 2012-10-09T14:54:58.087 に答える