我有一个通过 USB CDC/ACM 连接到 PC 的微控制器。当我尝试使用我尝试使用 SerialPort 制作的应用程序打开端口时,我在微控制器上看不到任何内容。我可以轻松地在 micro 中设置断点,并在使用 RealTerm、TeraTerm、PuTTy 等时观察端口打开/写入/读取/关闭事件被触发,但对于我的应用程序,什么都没有。没有给出错误,应用程序似乎认为一切正常。打开后,即使我在 micro 上看不到任何东西,其他终端应用程序也无法再连接到该端口,但是一旦我在我的应用程序中关闭它,它们又可以工作了。此外,如果我在打开后尝试写入端口,应用程序就会挂起。那么我错过了哪一步?
这是我的代码:
using System;
using System.ComponentModel;
using System.IO.Ports;
using System.Windows;
using System.Windows.Controls;
namespace SerialApp
{
public partial class MainWindow : Window
{
static SerialPort _serialPort = new SerialPort();
static byte[] read_buffer = new byte[4096];
static byte[] getSerialNumberCmd = { 0x6D, 0x69, 0x6E, 0x64, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
public MainWindow()
{
InitializeComponent();
}
private void comboBoxPorts_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
string port = comboBoxPorts.SelectedIndex.ToString();
port = "COM" + port;
_serialPort.PortName = port;
_serialPort.BaudRate = 115200;
_serialPort.Parity = Parity.None;
_serialPort.DataBits = 8;
_serialPort.StopBits = StopBits.One;
_serialPort.Handshake = Handshake.None;
_serialPort.ReadBufferSize = 4096;
_serialPort.WriteTimeout = 500;
_serialPort.ReadTimeout = 500;
}
private void button_Click(object sender, RoutedEventArgs e)
{
try
{
if (_serialPort.IsOpen) _serialPort.Close();
if (_serialPort != null)
{
_serialPort.Open();
_serialPort.DataReceived += Serial_DataReceived;
comboBoxPorts.IsEnabled = false;
buttonClosePort.IsEnabled = true;
buttonOpenPort.IsEnabled = false;
label1.Content = "Connected to " + _serialPort.PortName;
}
else
{
label1.Content = "Choose a COM port.";
}
}
catch(Exception ex)
{
label1.Content = "Invalid COM port.";
}
}
private void Serial_DataReceived(object s, SerialDataReceivedEventArgs e)
{
_serialPort.Read(read_buffer, 0, 64 + 12);
}
private void Window_Closing(object sender, CancelEventArgs e)
{
if (_serialPort.IsOpen)
{
_serialPort.Close();
}
if (_serialPort != null)
{
_serialPort.Dispose();
}
}
private void buttonClosePort_Click(object sender, RoutedEventArgs e)
{
if (_serialPort.IsOpen)
{
_serialPort.Close();
buttonClosePort.IsEnabled = false;
buttonOpenPort.IsEnabled = true;
comboBoxPorts.IsEnabled = true;
label1.Content = "Choose a COM port.";
}
}
private void buttonGetSerial_Click(object sender, RoutedEventArgs e)
{
try
{
if (_serialPort.IsOpen)
{
_serialPort.Write(getSerialNumberCmd, 0, 64);
}
}
catch(Exception ex)
{
_serialPort.Close();
labelSerialNumber.Content = ex.Message;
}
}
}
}
顺便说一句,我尝试在另一个完全不同系列的微控制器上做同样的事情,但我看到了相同的行为。
答案 0 :(得分:1)
尝试添加以下内容:
_serialPort.DtrEnable = true; //enable Data Terminal Ready
_serialPort.RtsEnable = true; //enable Request to send
请参阅 this post 以获取完整的代码示例。该博文是为 Windows 窗体编写的,但您也应该能够针对您的情况使用大部分代码。