【问题标题】:How to retain Serial Port State after postback ASP.net回发 ASP.net 后如何保留串行端口状态
【发布时间】:2013-07-04 08:47:10
【问题描述】:

我正在尝试将数据发送到 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); 
        }
     }
}

【问题讨论】:

  • 我不会从网站进行串行端口通信,而是拥有始终连接到设备的单独的专用服务。然后,您可以让您的网站与此服务进行通信。
  • 呵呵不,亲爱的..实际上你是想帮助我:P

标签: asp.net serial-port


【解决方案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:

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

以下示例来自以下链接。

您是否尝试在 !IsPostBack 代码块下编写一些代码来 检查回发时代码是否到达那里?在下面试试这个 测试

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

我将您要运行的代码称为一次性代码。为了你 正在尝试实现,以下应该工作。请注意 会话也过期。所以大约 20 分钟后(默认值) 不活动,如果用户返回站点/点击刷新,则 One 时间码将再次运行。如果你想要更持久的东西 20 分钟你可以尝试使用 cookie,但如果用户清除了他们的 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

【讨论】:

  • 嘿,谢谢你的回复,我试过你的代码。现在它在 sp.Open();//'System.UnauthorizedAccessException' 在 check(String ss) 方法中给出了异常。
  • 不,我用你的代码替换了连接/断开连接,页面加载时的连接建立和其他按钮事件使用你的检查方法。现在它给出异常 System.UnauthorizedAccessException.Access to the port 'COM1' is denied.
  • 我有一个获取端口名称的方法。但目前我在代码中分配端口名称,首先它是“COM10”,现在端口名称在设备管理器中重新配置为“COM1”。我尝试了别的东西。我在完成设置的页面加载时发送了一些数据。没关系。但是当我再次发送数据时回发后它没有。
  • 接收数据运行完美。但发送数据有问题。清楚地看到问题是当我在第一页加载时或之后发送数据时它工作得很好。但是在回发之后,发送数据会产生异常。
  • no.. 让我简要地向您解释整个问题。 1)页面加载 2)button1 clicked:(端口打开并发送“AT”):端口打开并发送“AT”。回发发生。 3) button2 clicked: (send another command)//异常,因为可能在回发后端口设置没有保留。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
相关资源
最近更新 更多