在C#gmail通知程序中拒绝COM5端口访问

时间:2012-12-08 09:24:53

标签: c# serial-port

我正在使用C#和Arduino制作Gmail通知程序 代码检查是否收到邮件,如果是,则发送'm'到串口 它看起来效果很好,但问题出在我收到此消息之后,

  

未读邮件:0

此消息将继续在屏幕上打印:

  

'COM5'端口访问被拒绝   “COM5”端口访问被拒绝   ...

这显然意味着在代码首次审判后拒绝访问COM5 我试着添加port.Close();到我的代码,但在第二次试用后代码没有循环 有点卡在这里。
我的代码似乎有什么问题?
类似的问题似乎在网上(Access to the port 'COM5' is denied),但我真的不明白我怎么能“包装使用SerialPort”。
谢谢!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
using System.Threading;
using System.Net;
using System.Xml;

namespace GMailNotifier
{
    class GMail
    {
        public static void Main(string[] args)
        {
            while (true)
            {
                try
                {
                    SerialPort port = new SerialPort("COM5", 9600, Parity.None, 8, StopBits.One);
                    port.Open();

                    string Unreadz = "0";
                    Unreadz = CheckMail();
                    Console.WriteLine("Unread Mails: " + Unreadz);

                    if (!Unreadz.Equals("0")) port.Write("m");
                    else port.Write("n");
                }catch (Exception ee){ Console.WriteLine(ee.Message);
                }finally { System.Threading.Thread.Sleep(1000); }
            }
        }
    private static string CheckMail() {
        string result = "0";

        try {
        var url = @"https://gmail.google.com/gmail/feed/atom";
        var USER = "USER";
        var PASS = "PASS";

        var encoded = TextToBase64( USER + ":" + PASS );

        var myWebRequest = HttpWebRequest.Create( url ); 
        myWebRequest.Method = "POST";
        myWebRequest.ContentLength = 0;
        myWebRequest.Headers.Add( "Authorization", "Basic " + encoded );

        var response = myWebRequest.GetResponse();
        var stream = response.GetResponseStream();

        XmlReader reader = XmlReader.Create( stream );
        while ( reader.Read() )
            if ( reader.NodeType == XmlNodeType.Element )
            if ( reader.Name == "fullcount" ) {
                result = reader.ReadElementContentAsString();
                return result;
            }
        } catch ( Exception ee ) { Console.WriteLine( ee.Message ); }
        return result;
    }
    public static string TextToBase64(string sAscii){
        System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
        byte[] bytes = encoding.GetBytes(sAscii);
        return System.Convert.ToBase64String(bytes, 0, bytes.Length);
    }
  }
}

2 个答案:

答案 0 :(得分:1)

您不应该在while中打开端口。尝试只打开一次端口(在循环外部)并仅关闭它一次(完成时或抛出异常时)。

答案 1 :(得分:0)

  

我真的不明白我怎么能“包装使用SerialPort”。

这意味着要做这样的事情:

using (SerialPort port = new SerialPort("COM5", 9600, Parity.None, 8, StopBits.One))
{
    port.Open();

    string Unreadz = "0";
    Unreadz = CheckMail();
    Console.WriteLine("Unread Mails: " + Unreadz);

    if (!Unreadz.Equals("0")) port.Write("m");
    else port.Write("n");
}

using语句将确保调用SerialPort.Dispose方法,以在完成使用后释放端口。如果您在第一次之后没有释放它,那么硬件仍然很忙,您将无法再次打开它(直到它以后被垃圾收集)。