我正在使用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);
}
}
}
答案 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方法,以在完成使用后释放端口。如果您在第一次之后没有释放它,那么硬件仍然很忙,您将无法再次打开它(直到它以后被垃圾收集)。