所以,我试图通过C#程序向一个arduino发送一个int。我有C#程序和arduino互相交谈就好了。我可以发送单个ASCII字节,并让arduino做出反应;但是,当我尝试发送一个更大的值 - 比如35 - 我可以弄清楚如何让arduino从串口获取信息,将其转换为int,以便稍后我可以将该值用于某些数学函数。任何提示/代码?谢谢堆叠家伙! :)
答案 0 :(得分:1)
这里有一种伪代码,因为你说微通信是好的。关于arduino:
char buffer[5]; // or 6 or 7 or... To store numerical chars
你需要一种方法让arduino知道一个数字正在下线。 假设您的号码打包在这样的“数据包”中:
[I123]
括号表示数据包的开始和结束,I表示整数是数据有效负载。所以在Serial.Read()函数中你必须测试数据包的开始([),然后测试表示整数(I)的下一个字符,然后剩余的字符应保存在缓冲区中但不包括(] )。然后使用value = atoi(缓冲区)获取值。
/*
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';
}
}
}
答案 1 :(得分:0)
这取决于所需的协议。您想要一种紧凑的数据格式,还是想要一种人类可读/可写的格式?
如果你选择紧凑型数据结构,你应该研究序列化的概念。如果您更喜欢易于阅读和手写的格式,那么您必须自己实施某种协议。 首先,我想我会建议后者。
从可以将字符串打包成字符串的内容开始,然后将其提供给atoi
函数。
对不起,这里不是预先解决的解决方案。
答案 2 :(得分:0)
您可能希望使用CmdMessenger library,或者您可能希望将有限状态机用作outlined here或implemented in an example in my blog。
答案 3 :(得分:0)
我已经回答了这个问题here。你可以使用“atoi”。 c#的代码非常简单。在我的回答/链接中,您可以找到Arduino的代码。 基本上这是一个协议。