我正在使用C#和arduino。我还是个新手。我希望有人能帮助我。所以我的项目是向Arduino发送一些代码。然后在Arduino上应用延迟并将一些字符串/字符发送回C#。我在C#上给了一个文本框来显示阅读结果。这是我的代码: C#代码
Public form1()
{
initializeComponent();
Serialport1.Open();
}
public void Read()
{
while (Serialport1.IsOpen)
{
try
{
string message = SerialPort1.ReadLine();
textbox1.text = message;
}
catch (timeoutException)
{
}
}
}
private void button1_click(object sender, eventargs e)
{
SerialPort1.write("A");
read();
}
arduino代码:
int data;
void setup()
{
Serial.begin(9600);
Serial.print("START\n");
}
void loop()
{
if(Serial.available())
{
data = Serial.read();
if(data=='A')
{
delay(3000);
Serial.print("B");
}
}
}
我希望文本框结果写入B,但没有任何内容,文本框保持空白。我做错了什么?我希望有人可以向我解释。谢谢
答案 0 :(得分:1)
ReadLine
是根据documentation
返回输入缓冲区的内容,直到第一次出现NewLine值 ....
默认情况下,ReadLine方法将阻塞,直到收到一行。如果不希望出现这种情况,请将ReadTimeout属性设置为任何非零值,以强制ReadLine方法在端口上没有行时抛出TimeoutException。
因此,如果你看看arduino发送的内容,只需"B"
。您应该在邮件中添加换行符:"B\n"
或使用println方法自动添加新行。
但主要的问题实际上是你永远不会从方法Read
返回,所以GUI永远不会更新,即使你收到的东西你也看不到它。
此外,在while循环中,建议仅在数据在缓冲区中时读取。您可以使用BytesToRead属性来检查是否值得从端口读取:
while (Serialport1.IsOpen)
{
if (Serialport1.BytesToRead > 0)
{
try
{
string message = Serialport1.ReadLine();
textbox1.text = message;
// break out the while loop here so that you can see the content of the textbox
break;
}
catch (Exception ex)
{
textbox1.text = "ERROR: " + ex.Message;
}
}
}
这也是一个坏习惯,捕捉一个预测,不对这些信息做任何事情。因为它经常让你掌握错误的本质。到目前为止,你只是掩盖了它。
答案 1 :(得分:1)
试试这个:
功能:
Arduino代码:
const int LedPin = 13;
int ledState = 0;
void setup()
{
pinMode(LedPin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
char receiveVal;
if(Serial.available() > 0)
{
receiveVal = Serial.read();
if(receiveVal == '1')
ledState = 1;
else
ledState = 0;
}
digitalWrite(LedPin, ledState);
delay(50);
}
C#代码:
using System;
using System.Windows.Forms;
using System.IO.Ports;
namespace ledcontrol
{
public partial class Form1 : Form
{
SerialPort port;
public Form1()
{
InitializeComponent();
this.FormClosed += new FormClosedEventHandler(Form1_FormClosed);
if (port==null)
{
port = new SerialPort("COM7", 9600);//Set your board COM
port.Open();
}
}
void Form1_FormClosed(object sender,FormClosedEventArgs e)
{
if(port !=null &&port.IsOpen)
{
port.Close();
}
}
private void button1_Click(object sender, EventArgs e)
{
PortWrite("1");
}
private void button2_Click(object sender, EventArgs e)
{
PortWrite("0");
}
private void PortWrite(string message)
{
port.Write(message);
}
}
}
您可以在此处查看教程:http://www.lattepanda.com/topic-f6t1534.html?sid=0aac1b4a519c7a2d970b81059e6e581f
答案 2 :(得分:0)
您应该将侦听器附加到端口,如下所示:
SerialPort port = new SerialPort("COM4", 9600);
port.DataReceived += new SerialDataReceivedEventHandler(dataReceivedHandler);
port.open();
然后编写你的处理程序,如:
private void dataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Dispatcher.Invoke(
delegate
{
textbox1.Text = indata;
});
}
您的按钮点击也可以是这样的:
private void button1_click(object sender, RoutedEventArgs e)
{
try {
port.Write("A");
}
catch (Exception ex)
{
textbox.Text = " Send Failed !";
}
}