C# C和Arduino之间的通信

C# C和Arduino之间的通信,c#,arduino-uno,C#,Arduino Uno,C代码 using System; using System.Windows.Forms; using System.IO.Ports; SerialPort port; private void btnStart_Click(object sender, EventArgs e) { port = new SerialPort("COM6", 9600); port.Open(); por

C代码

using System;

using System.Windows.Forms; 

using System.IO.Ports;

SerialPort port;

    private void btnStart_Click(object sender, EventArgs e)
        {
            port = new SerialPort("COM6", 9600);
            port.Open();
            port.Write("START");
            port.Close();
        }
Arduino代码

"#"include "MOVIShield.h"

MOVI recognizer(true); 
循环中的代码

signed int res=recognizer.poll();

  if(Serial.available() > 0){

    String data = Serial.readString();

    if(data = "START"){
             recognizer.ask("Hello. My name is John");
    }
  }

我试图单击btnStart将START发送到我的Arduino程序,Arduino程序应该以askHello的方式运行。收到C程序的数据后,我叫约翰。但是,当我单击btnStart时,什么也没有发生。

您可以尝试不同的方法或几种不同的方法:

1-确保两侧的COM端口参数相同

正如在

将其添加到循环外部的Arduino C代码中:

Serial.begin(9600);
并将C更改为类似以下代码:

private void btnStart_Click(object sender, EventArgs e)
{
    port = new SerialPort("COM6", 9600);
    port.DataBits = 8;
    port.StopBits = StopBits.One;
    port.Handshake = Handshake.None;
    port.Parity = Parity.None;
    port.Open();
    port.Write("START");
    port.Close();
}
2-使用不同于C的工具测试是否可以与Arduino通信


e、 g.这个工具有15天的演示时间:

我想这一行中的单个相等者可能与此有关。 如果data=START

也许您应该使用PortWrite;而不是port.write

下面是一个类似的演示,可以帮助您:

C代码:

using System;
using System.Windows.Forms;
using System.IO.Ports;
namespace lightcontrol
{
    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);
        }
    }
}
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);      
}  
以下是教程:

我相信不会有一个直接的答案来解释它为什么不工作,它需要您进行更多的调试,并对每个小变量进行微调。首先,其他COM端口参数如何?奇偶校验、数据位和停止位。您是否在带有硬件COM端口的PC上运行C并将其连接到Arduino?还是USB电缆显示为COM端口?你确定是COM6吗?我用电缆将arduino板连接到电脑。我确认它是COM6,波特率是正确的。我找不到arduino程序的奇偶校验位、数据位和停止位。请检查这是否有用:很抱歉,我无法很好地理解您提供的链接中的描述。问题的原因是串行端口需要填入奇偶校验位、数据位和停止位吗?除非Arduino文档中规定了默认值,否则您不能假定这些值中的任何一个,甚至需要在C代码中说明这些默认值。但是如果没有像默认值这样的东西,你必须在Arduino上的C代码和PC上的C代码中设置相同的值才能说话。对于串行。开放部分,循环外的含义是在设置中吗?我想我有点困惑了,从我看到的链接来看,哪个C代码是Arduino代码,看起来您只需要在Arduino端设置波特率,这表明您仍然需要在C中设置其他值的默认值,正如我之前所说。我按照您提供的步骤进行操作,但在单击btnStart之后,仍然没有发生任何事情。我没有注意到这一点,但确定ifdata=start不起作用。您必须使用类似于ìf strcmpdata的东西,开始