C#:未触发serialPort的DataReceived事件处理程序

C#:未触发serialPort的DataReceived事件处理程序,c#,serial-port,C#,Serial Port,我正在编写一个相当基本的应用程序,其中一个任务是与Arduino Uno卡通信。 我想将串行通信作为一个单独的模块编写,因此表单只需要Arduino的输入,模块将处理串行端口的创建和打开以及从中读取数据。 出于测试目的,我为Arduino编写了一个程序,它每半秒将经过的毫秒数打印到serialPort。 我想在按下按钮后用Arduino的输出填充表单的文本框。 我在SerialComm类中创建serialPort,虽然我将DataReceived事件处理程序附加到它,但它似乎从未触发。 以下是S

我正在编写一个相当基本的应用程序,其中一个任务是与Arduino Uno卡通信。
我想将串行通信作为一个单独的模块编写,因此表单只需要Arduino的输入,模块将处理串行端口的创建和打开以及从中读取数据。
出于测试目的,我为Arduino编写了一个程序,它每半秒将经过的毫秒数打印到serialPort。
我想在按下按钮后用Arduino的输出填充表单的文本框。
我在SerialComm类中创建serialPort,虽然我将DataReceived事件处理程序附加到它,但它似乎从未触发。
以下是SerialComm类的代码:

class SerialComm
{
    private List<String> availablePorts;
    private SerialPort arduino;
    private string receivedText;

    public String[] portList
    { get
        {
            EnumPorts();
            return availablePorts.ToArray();
        }
    } 
    public string receivedData
    {
        get
        {
            return receivedText;
        }
    }

    public void InitialiseSerial()
    {
        arduino = new SerialPort();
        arduino.BaudRate = 9600;
        arduino.DtrEnable = true;
        // Add event handler
        arduino.DataReceived += new SerialDataReceivedEventHandler(arduino_DataReceived);
    }

    public void EnumPorts()
    {
        availablePorts = new List<string>();
        foreach (string s in SerialPort.GetPortNames())
        {
            availablePorts.Add(s);
        }
    }

    public void StartMC(SerialPort serialPort, String portName)
    {
        arduino = serialPort;
        if (arduino.IsOpen)
        {
            arduino.Close();
        }
        else
        {
            //Initialise Serial Port
            arduino.PortName = portName;        
            arduino.Open();
        }          
    }

    //This never fires==================
    private void arduino_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        receivedText = arduino.ReadExisting();           
    }

    public void CloseMC()
    {
        if (arduino.IsOpen)
        {
            arduino.Close();
            arduino.Dispose();
        }
    }
}
类串行通信
{
私有列表可用报告;
阿杜伊诺港;
私有字符串receivedText;
公共字符串[]端口列表
{得到
{
枚举端口();
return availableport.ToArray();
}
} 
公共字符串接收数据
{
得到
{
返回接收到的文本;
}
}
public void InitialiseSerial()
{
arduino=新的串行端口();
arduino.BaudRate=9600;
arduino.DtrEnable=true;
//添加事件处理程序
arduino.DataReceived+=新的SerialDataReceivedEventHandler(arduino_DataReceived);
}
公共端口()
{
AvailableReports=新列表();
foreach(SerialPort.GetPortNames()中的字符串s)
{
可用报告。添加;
}
}
public void StartMC(SerialPort SerialPort,String portName)
{
arduino=串行端口;
if(arduino.IsOpen)
{
arduino.Close();
}
其他的
{
//初始化串行端口
arduino.PortName=端口名;
arduino.Open();
}          
}
//这永远不会开火==================
private void arduino_DataReceived(对象发送方,SerialDataReceivedEventArgs e)
{
receivedText=arduino.ReadExisting();
}
公营房屋委员会()
{
if(arduino.IsOpen)
{
arduino.Close();
adpose();
}
}
}
在表单中,我像这样调用Arduino的文本:(我有一个按钮(Button1)、一个用于选择COM端口的组合框(comboBox1)和表单上的一个文本框)

公共部分类表单1:表单
{
SerialComm arduino=新的SerialComm();
公共表格1()
{
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e)
{    
//阿杜伊诺
arduino.InitialiseSerial();
字符串[]端口列表=arduino.portList;
foreach(端口列表中的字符串COM)
{
comboBox1.Items.Add(COM);
}
如果(portList.Length>0)
{
comboBox1.SelectedItem=comboBox1.Items[0];
}
其他的
{
comboBox1.Text=“未找到微控制器!”;
}
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
StartMC(serialPort1,comboBox1.SelectedItem.ToString());
//由于接收到的数据从未触发arduino,因此receivedData保持为空
if(arduino.receivedData!=null)
{
对于(int i=0;i<101;i++)
{
textBox1.AppendText(arduino.receivedData);
}
}        
}
私有作废Form1\u FormClosing(对象发送方,FormClosingEventArgs e)
{
arduino.CloseMC();
}
}
您看到事件处理程序没有触发的原因了吗? 非常感谢您事先的帮助

致以最良好的祝愿,
Peter

除了DTR,您是否尝试过启用RTS?“我为Arduino编写了一个打印程序”-错误可能在那里。DataReceived工作异步,但当您开始发送数据时,您仍然使用您的方法。因此,你永远不会给事件触发的机会。您必须结束单击方法。然后,为了获得一个简单的解决方案,请使用计时器并尝试接收数据。对于迟来的回答,非常抱歉,感谢您的帮助。节食者的解决方案奏效了。设置RTS和DTR没有任何区别。除了DTR之外,您是否尝试过启用RTS?“我为Arduino编写了一个程序,该程序会打印”-错误可能在那里。DataReceived工作异步,但当您开始发送数据时,您仍然使用您的方法。因此,你永远不会给事件触发的机会。您必须结束单击方法。然后,为了获得一个简单的解决方案,请使用计时器并尝试接收数据。对于迟来的回答,非常抱歉,感谢您的帮助。节食者的解决方案奏效了。设置RTS和DTR没有任何区别。
public partial class Form1 : Form
{
    SerialComm arduino = new SerialComm();

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {    
        //Arduino
        arduino.InitialiseSerial();
        String[] portList = arduino.portList;
        foreach (String COM in portList)
        {
            comboBox1.Items.Add(COM);
        }

        if (portList.Length > 0)
        {
            comboBox1.SelectedItem = comboBox1.Items[0];
        }
        else
        {
            comboBox1.Text = "No microcontroller found!";
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        arduino.StartMC(serialPort1, comboBox1.SelectedItem.ToString());

        //as the DataReceived never fires arduino.receivedData stays null
        if (arduino.receivedData != null)
        {
            for (int i = 0; i < 101; i++)
            {
                textBox1.AppendText(arduino.receivedData);
            }
        }        
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        arduino.CloseMC();
    }
}