serialPort_DataReceived在exe文件中不起作用

时间:2014-10-28 13:09:20

标签: c# serial-port

我用串口编写了一个程序:

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        serialLabel.BackColor = Color.Red;
        storage = serialPort1.ReadExisting();

        if (storage.Contains("CMGL"))
        {
            if (storage.Length > 65)
            {
                processUnreadedMessages(storage);
            }
            else
            {
                Thread.Sleep(500);
            }
        }
        else if (storage.Contains("CMTI"))
        {
            serialPort1.Write("AT+CMGL\r");
            Thread.Sleep(500);
        }
        storage = "";
        serialLabel.BackColor = Color.Lime;
    }
在Visual Studio中运行程序时效果很好! 但是当我为我的程序创建设置或运行exe文件时,数据不会收到serialPort,我也不会收到任何错误。但是当我用这个程序发送数据时它就可以了!

你可以帮我吗?

1 个答案:

答案 0 :(得分:2)

有问题的行可能是那些:

serialLabel.BackColor = Color.Red;

serialLabel.BackColor = Color.Lime;

在开发环境中它仍然很有可能仍然有效,但是:

  

当数据出现时,在辅助线程上引发DataReceived事件   从SerialPort对象接收。因为这个事件是在一个   辅助线程,而不是主线程,试图修改一些   主线程中的元素,如UI元素,可以引发一个   线程异常。如果有必要修改main中的元素   表单或控件,使用Invoke发回更改请求,这样做   正确的线程上的工作。

[msdn]

尝试改为:

serialLabel.Invoke(new EventHandler(delegate
{
   serialLabel.BackColor = Color.Red;
}));

此外:

  • 确保在方法processUnreadedMessages()中没有调用(例如,您也不应该在没有调用的情况下将数据写入EventLog)的情况下,不要触摸GUI或任何应该从其创建的线程访问的GUI
  • 检查调试应用程序时是否没有First Chance异常
  • 检查应用程序EventLog以查找应用程序生成的消息。
  • 在您执行任何其他操作之前将您在serialPort1_DataReceived事件中收到的数据记录到文件中(这将检查DataReceived事件是否应该引发它)
  • 订阅SerialPort。ErrorReceived event