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