1

所以,我试图通过 C# 程序向 arduino 发送一个 int。我有 C# 程序和 arduino 互相交谈很好。我可以很好地发送单个 ASCII 字节并让 arduino 做出反应;但是,当我尝试向它发送一个更大的值(比如 35)时,我可以弄清楚如何让 arduino 从串行端口获取该信息,将其转换为 int,以便以后可以将该值用于一些数学函数。任何提示/代码?感谢堆栈家伙!:)

4

4 回答 4

1

这里有点伪代码,因为您声明与 micro 的通信很好。在arduino上:

    char buffer[5]; // or 6 or 7 or... To store numerical chars

你需要一种方法让 arduino 知道有一个数字即将到来。假设您的号码被打包在一个“数据包”中,如下所示:

    [I123]

括号表示数据包的开始和结束,I 表示整数是数据有效负载。因此,在 Serial.Read() 函数中,您必须测试数据包的开始 ([),然后测试指示整数 (I) 的下一个字符,然后剩余的字符应保存在缓冲区中,但不包括 (] )。然后使用 value = atoi(buffer) 获取值。

/*
 Simple code to read in an integer value sent over the Serial port.
 */

char ch;         // incoming serial character

char chStartPacket = '[';
char chEndpacket =']';
char integerDataType = 'I';
char buf[10];
int index = 0;
int intValue = 0;

void setup()
{
  // start serial port at 9600 bps:
  Serial.begin(9600);

}

void loop()
{
  // assume packet of format [Xddd], where X is packet data type, ddd is data payload
  // this is code which compiles, but not tested. Neither is any check done on the payload data 
  // to ensure good data

  if(Serial.available() > 0){

    if(Serial.peek() == chStartPacket ){
      index = 0;                                // reset index of next integer in buffer
      Serial.read();                            // get rid of start of packet in serial port buffer
    }  
    else if (Serial.peek()  == integerDataType){
      Serial.read();                           // get rid of data type character in serial port buffer
    }
    else if (Serial.peek() == chEndpacket){    // all data received, get integer value
      Serial.read();                           // get rid of end of packet in serial port buffer
      intValue = atoi(buf);
      Serial.println(intValue);                // for visual feedback
    }
    else{                                      //must be payload data, add to buffer
      buf[index] = Serial.read();
      index++;
      buf[index] = '\0';
    }

  }
}
于 2013-05-26T21:14:44.180 回答
0

您可能想要使用CmdMessenger 库,或者您可能想要使用此处概述在我的博客中的示例中实现的有限状态机。

于 2013-05-27T11:10:21.257 回答
0

我已经在这里回答了这个问题。您可以使用“atoi”。c# 的代码非常简单。在我的答案/链接中,您可以找到 Arduino 的代码。基本上这充当协议。

于 2013-06-19T13:36:14.070 回答
0

这在一定程度上取决于所需的协议。您想要一种紧凑的数据格式还是想要一种人类可读/可写的格式?

如果您选择紧凑的数据结构,您应该研究序列化的概念。如果您更喜欢易于阅读和手写的格式,则必须自己实现某种协议。首先,我想我会建议后者。

从可以将字符流打包成字符串然后将其提供给atoi函数的东西开始。

抱歉,这里不是预先准备好的解决方案。

于 2013-05-26T19:29:59.120 回答