arduino写作和阅读

时间:2017-06-08 12:41:20

标签: c# arduino serial-port

我正在使用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,但没有任何内容,文本框保持空白。我做错了什么?我希望有人可以向我解释。谢谢

3 个答案:

答案 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:打开/关闭LED

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 !";
        }
    }