【发布时间】:2012-03-17 11:20:20
【问题描述】:
我有一块 FEZ 板(我认为这并不重要),我正在通过串行端口与它通信。 我制作了一个 WPF 应用程序,在其中打开 COM 端口并在其上写入数据。 这一切都很好,但是在发送数据随机次数(有时是 3 次,有时是 4 次)之后,当我再次尝试发送时,我在端口的 Write 方法上收到一个异常消息“连接到系统的设备不起作用”或尝试在此异常后关闭端口我得到“访问端口被拒绝”。当我重新启动程序时,我在 Open 方法上遇到同样的错误(当然这是合乎逻辑的)。当我只是断开代表串行链路的 USB 并重新连接它时,我可以再次使用该端口。
这是我的代码:
SerialPort port = new SerialPort("COM10", 9600);
public MainWindow()
{
InitializeComponent();
port.Open();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
SendMessage("Relay1On\r\n");
}
private void button2_Click(object sender, RoutedEventArgs e)
{
SendMessage("Relay1Off\r\n");
}
private void SendMessage(string message)
{
try
{
port.Write(message);
}
catch (Exception exc)
{
listbox1.Items.Add(exc.Message);
}
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
port.Close();
}
我不认为我在做任何奇怪的事情。 在 FEZ Board 上运行的代码如下:
private Gadgeteer.Interfaces.DigitalOutput _relay;
void ProgramStarted()
{
try
{
usbSerial.Configure(9600, GT.Interfaces.Serial.SerialParity.None, GT.Interfaces.Serial.SerialStopBits.One, 8);
usbSerial.SerialLine.LineReceivedEventDelimiter = "\r\n";
usbSerial.SerialLine.AutoReadLineEnabled = true;
usbSerial.SerialLine.ReadTimeout = GT.Interfaces.Serial.InfiniteTimeout;
usbSerial.SerialLine.LineReceived += new GT.Interfaces.Serial.LineReceivedEventHandler(SerialLine_LineReceived);
usbSerial.SerialLine.Open();
_relay = eBlockExpansion.SetupDigitalOutput(GT.Socket.Pin.Nine, false);
}
catch (Exception exc)
{
throw exc;
}
}
void SerialLine_LineReceived(GT.Interfaces.Serial sender, string data)
{
if (data == "Relay1On")
{
_relay.Write(true);
}
else if (data == "Relay1Off")
{
_relay.Write(false);
}
}
但我觉得这更多地与桌面端有关。
【问题讨论】:
-
USB 驱动程序因这种麻烦而臭名昭著。试着找到一个更新,扔掉它,如果没有成功,再试试另一个。
-
@HansPassant:我同意这一点。我从 FTDI (ftdichip.com) 获得了更新的驱动程序,它极大地提高了我的 USB/串行适配器的可靠性。
标签: c# serial-port access-denied .net-micro-framework netduino