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