回发ASP.net后如何保留串口状态

时间:2013-07-04 08:47:11

标签: asp.net serial-port

我正在尝试将数据发送到ASP.net中的串行端口。连接到串行端口之后发送回发数据之前。但是回发后我发送数据时会遇到异常。

'System.InvalidOperationException: The port is closed.'

我通过连接到pageload上的端口尝试了所有内容:ispostback,并再次断开连接。它仍显示相同的异常。有没有办法保留串口状态..

这是我的代码。请帮帮我......

public partial class _Default : System.Web.UI.Page
{
    string indata;
    public SerialPort sp = new SerialPort();

    protected void Page_Load(object sender, EventArgs e)
    {

        if (IsPostBack)
        {

            openPort("COM10");
            disconnect();
            connect();
        }
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        //disconnect();
        openPort("COM10");
        connect();
        check(TextBox1.Text); //Data Sending Successful but after postback even it doesnt work too.
    }

    public void connect()
    {
        try { sp.Open(); }
        catch (Exception e1) { MessageBox.Show(e1.ToString()); }
    }

    public void disconnect()
    {
        try { sp.Close(); }
        catch (Exception e1) { MessageBox.Show(e1.ToString()); }
    }

    public void openPort(string p)
    {
        sp.BaudRate = 9600;
        sp.Parity = Parity.None;
        sp.StopBits = StopBits.One;
        sp.DataBits = 8;
        sp.Handshake = Handshake.None;
        sp.PortName = p;
        sp.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
       // sp.ReadTimeout = 200;
       // sp.WriteTimeout = 200;
    }

    private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        indata = sp.ReadExisting();
        Debug.WriteLine(" Data Received:");
        Debug.Write(" " + indata);
    }

    protected void Button4_Click(object sender, EventArgs e)
    {
        check("" + (char)26); //Exception in sending
    }

    protected void Button3_Click(object sender, EventArgs e)
    {
        check("\r\n"); //exception in sending
    }

    protected void Button2_Click(object sender, EventArgs e)
    {
        check(TextBox1.Text); // exception in sending
    }
    void check(string ss)
    {
        //sp.Dispose();
        //openPort("COM10"); connect();
        if (sp.IsOpen)
            sp.Write(ss);
        else
        { 
            disconnect(); openPort("COM10"); connect(); 
            sp.Write(ss); 
        }
     }
}

1 个答案:

答案 0 :(得分:1)

我会简化你的代码,所以在页面加载时配置端口,一个处理程序处理重置你的端口。断开,连接,我看到使它变得复杂。这里我举了一个使用按钮点击事件的例子 请注意下面缺少的支架。

public partial class _Default : System.Web.UI.Page
{
string indata;
public SerialPort sp = new SerialPort();

protected void Page_Load(object sender, EventArgs e)
{
            sp.BaudRate = 9600;
            sp.Parity = Parity.None;
            sp.StopBits = StopBits.One;
            sp.DataBits = 8;
            sp.Handshake = Handshake.None;
            sp.PortName = p;
            sp.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
           // sp.ReadTimeout = 200;
           // sp.WriteTimeout = 200;
        }
if (!Page.IsPostBack)
        {
        sp.BaudRate = 9600;
        sp.Parity = Parity.None;
        sp.StopBits = StopBits.One;
        sp.DataBits = 8;
        sp.Handshake = Handshake.None;
        sp.PortName = p;
        sp.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
       // sp.ReadTimeout = 200;
       // sp.WriteTimeout = 200;
    }

protected void Button1_Click(object sender, EventArgs e)

if sp.IsOpen = False then
{
    try { sp.Open(); }
    catch (Exception e1) { MessageBox.Show(e1.ToString()); }
}
else
{
    try { sp.Close(); }
    catch (Exception e1) { MessageBox.Show(e1.ToString()); }
}

void check(string ss)
{
    //sp.Dispose();
    //openPort("COM10"); connect();
    if (sp.IsOpen)
    {//missing brace
        sp.Write(ss);
    }//missing brace
    else
    { 
        sp.Open(); 
        sp.Write(ss); 
    }
 }
}

编辑2:

正如我在评论中提到的,代码只会运行一次。

以下链接提供了以下示例。

  

您是否曾尝试在!IsPostBack代码块下编写一些代码   检查代码在回发时是否会在那里点击?试试这个   测试

protected void Page_Load(object sender, EventArgs e)
{
        if (!Page.IsPostBack)
        {
            Response.Write("First load");
        }
        else
        {
            Response.Write("Postback occurs");
        }
}

  

我会将您想要运行的代码称为一次性代码。对你而言   正在努力实现,以下应该工作。请注意   会议也将过期。所以大约20分钟后(默认值)   不活动,如果用户回到网站/点击刷新,一个   时间码将再次运行。如果你想要更持久的东西   20分钟你可以尝试使用cookies,但如果用户清除他们的cookie   你的一次性代码再次运行。

protected void Page_Load(object sender, EventArgs e)
{
   if (Session["firsttimeuser"] == null)
   {
     //put code here for One Time Code;
     Session["firsttimeuser"] = true;
   }
}

请看这个链接:

对此进行了长时间的讨论。

http://forums.asp.net/t/1314918.aspx/1

您应该能够从中创建解决方案,请提供建议。

修改1

请参阅MSDN获取端口名称:

  

使用GetPortNames方法查询当前计算机的列表   有效的串行端口名称。例如,您可以使用此方法   确定COM1和COM2是否是当前的有效串行端口   计算机。

http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.getportnames.aspx

和SerialPort.Open

 _serialPort.PortName = SetPortName(_serialPort.PortName)

http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.open.aspx

编辑3

尝试:

 if (!IsPostBack) or

if(!Page.IsPostBack)

请参阅:

Implementation of IsPostBack in page load

What is a postback?

http://msdn.microsoft.com/en-us/library/ms178472.aspx