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

该事件必须在您已经声明 serialPort1 的同一线程(我想是 UI 线程)中运行。您可以在不同的线程中执行来自 serialPort1_DataReceived 事件的代码。该线程应该由 serialPort1_DataReceived 事件处理程序启动。问题是 CompactFramework 没有 ParameterisedThreadStart 所以你不能有效地将接收到的数据传递给线程。您将需要使用委托设置一些全局字段。

于 2012-10-09T13:51:07.377 回答
1

是的,但我认为您的线程在事件触发之前完成。您应该按照以下方式创建表单,请注意这是桌面代码,但模拟了 CompactFramework 中可用的内容,因为我没有在此处安装它。第一个 Form1 是主窗体,它启动线程,其中是 Form2。Form2 有一个正在工作的按钮和 Click EventHandler,但您需要使用 Application.Run() 显示您的 Form2。这是示例代码:

 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 回答