我试图将我的arduino(leonardo)中的字符串发送到C#程序。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
SerialPort mySerialPort = new SerialPort("COM7");
mySerialPort.BaudRate = 9600;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.None;
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
mySerialPort.Open();
Console.WriteLine("Press any key to continue...");
Console.WriteLine();
Console.ReadKey();
mySerialPort.Close();
}
static void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Console.WriteLine("Data Received:");
Console.Write(indata);
}
}
}
这是我从msdn示例中复制的代码,试图理解它的作用。 我下面的arduino代码只是通过te com端口发送hello world,延迟为1000。
void setup ()
{
Serial.begin(9600);
}
void loop(){
Serial.println("Hello World");
delay(1000);
}
我的arduino就像我在C#程序中定义的那样使用COM7。当我运行bot程序时,C#程序永远不会进入datareceived事件处理程序。因此没有收到任何数据。我真的希望工作:)
亲切的问候
答案 0 :(得分:0)
控制台应用程序没有消息循环,所以他们自然不会对事件做出响应。你有一个线程,它会在Console.ReadKey()
被阻塞。使用串行端口的同步读取,或者如果您希望坚持基于事件的模型,请将此代码移动到基于Windows的应用程序。
对于同步示例,see this MSDN example:
while (_continue)
{
try
{
string message = _serialPort.ReadLine();
Console.WriteLine(message);
}
catch (TimeoutException) { }
}
以上只是一个摘录 - 完整示例演示了设置超时值等等。
答案 1 :(得分:0)
我将代码切换到Windows窗体应用程序,它仍然无法正常工作。然后我找到了一个关于与C#进行串行通信的话题,关于arduino leonardo here
我必须这样做:
serial.DtrEnable = true;
serial.RtsEnable = true;
我认为我的问题已经解决了。