PDA

View Full Version : Access to the port 'COM5' is denied



minaalamshahi
شنبه 25 آذر 1391, 13:23 عصر
با سلام

من بعد از مدتی که با پورتم کار می کنم به این errror میرسم
برای آزاد سازی منابع بعد از هر قطع اتصال هم


if (COM.IsOpen)
COM.Close();
else
GC.SuppressFinalize(_SafeBaseStream);
if (COM != null)
{
COM.Dispose();
COM = null;
}

این کار رو می کنم
اما گاهی با این حال در باز کردن پورت این مشکل رو دارم و باید برنامه رو کامل ببندم و دوباره باز کنم

minaalamshahi
شنبه 25 آذر 1391, 14:16 عصر
GC.SuppressFinalize یعنی چی؟
ترتیبش رو اشتباه نوشتم؟

barnamenevisforme
شنبه 25 آذر 1391, 23:28 عصر
سلام
ابتدا به این نکته اشاره کنم که کد شما فقط روی host جواب میده و برای client باید فکر دیگه ای کرد.
این کد رو امتحان بفرمایید:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO.Ports;
using System.Text;

public partial class Default2 : System.Web.UI.Page
{
public static SerialPort COM1 = new SerialPort("COM1", 9600, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One);

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
COM1.Handshake = Handshake.None;
COM1.ReadTimeout = 10000;
COM1.DtrEnable=true;
}
}


protected void btnWrite_Click(object sender, EventArgs e)
{
try
{
if (Session["com"] == null)
{
if (!COM1.IsOpen) COM1.Open();
Session["com"] = COM1;
COM1.WriteLine(txt_temp.Text);
}
txt_temp.Text = COM1.IsOpen.ToString();
}
catch (Exception ex)
{
if (COM1.IsOpen)
COM1.Close();
}
}

protected void btnRead_Click(object sender, EventArgs e)
{

if (Session["com"] != null)
{
COM1 = (SerialPort)Session["com"];
COM1.DtrEnable = true;
StringBuilder buffer = new StringBuilder();
string line = "";

try
{
if (!COM1.IsOpen) COM1.Open();

do
{
line = COM1.ReadLine(); // <- this line throws exception of timeout. I tried COM1.ReadByte() but no luck.

if (line == null)
break;
else
buffer.Append(line);

} while (true);

txtResult.Text = buffer.ToString();
}
catch (Exception ex)
{
txtResult.Text = ex.ToString();
if (COM1.IsOpen) COM1.Close();
throw;
}
finally
{
if (COM1.IsOpen) COM1.Close();
}
}
}
}

minaalamshahi
یک شنبه 26 آذر 1391, 09:56 صبح
من الان دارم روی local جواب میگیرم

minaalamshahi
یک شنبه 26 آذر 1391, 10:32 صبح
من reader رو روی پورت com5 تنظیم کردم
اما وقتی برنامه رو روی هاست میذارم
com1,com2 رو می شناسه
و هیچ datarecive انجام نمیشه

barnamenevisforme
یک شنبه 26 آذر 1391, 22:55 عصر
سلام
ببخشید دیر جواب میدم

برنامه شما که توسط asp.net نوشته و آماده میشه،در نهایت روی یک سیستم نصب خواهد شد(در حال حاضر سیستم خودتون که localhost هست و در آینده که روی یک host قرار میگیره)،بقیه سیستم هایی که به محتویات سایت طراحی شده شما دست خواهند یافت client خواهند بود و عملا پردازش اصلی برنامه شما روی اونها انجام نمیشه و فقط روی host انجام میشه.

حال با این کدی که شما تهیه فرمودید،دسترسی به com port سیستم host _یعنی پردازشگر اصلی برنامه _امکان پذیر خواهد بود.

وقتی شما برنامه رو روی host جهت بهره برداری load میکنید،طبیعیه که از com های موجود اطلاعاتی دریافت نکنید،چون به احتمال زیاد host comport به چیزی وصل نیست(و شما فکر میکنید باید اطلاعات پورتی که شما روی سیستمتون دارید رو بخونه)

پس عملا با برنامه شما فقط یکی از سیستم ها و اون هم فقط host به comport دسترسی خواهیم داشت(در مورد اینکه آیا سرویس دهندگان اجازه چنین دسترسی رو بدن و یا اصلا این حالت در چه موردی کاربردیه بماند)