1

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

'System.InvalidOperationException: The port is closed.'

我通过在页面加载上连接到端口尝试了一切: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); 
        }
     }
}
4

1 回答 1

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 分钟(默认值)不活动后,如果用户返回站点/点击刷新,One Time Code 将再次运行。如果你想要一些比 20 分钟更持久的东西,你可以尝试使用 cookie,但如果用户清除了他们的 cookie,你的 One Time Code 会再次运行。

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)

请参见:

IsPostBack 在页面加载中的实现

什么是回发?

和:

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

于 2013-07-04T11:40:02.753 回答