我正在建立一个飞行模拟器,我有一个名为fsuipc的程序,它允许你连接到微软飞行模拟器x,你可以用c#读写数据 - 非常方便!
我已经建立了一个垂直速度计,它只是一个带针的伺服器。它连接到一个运行c ++版本的arduino。我希望c#将当前的垂直速度发送到arduino,但遇到了问题,并且在过去的两天内尝试过。
问题在于,arduino发回的内容主要是-1,当它应该发回1566(每分钟英尺)之类的东西时抛出奇数49。
帮助!
这是处理垂直速度的c#代码部分(忽略有效的空速)。显示当前空速的值工作正常,但收到的发送完全错误
private void timer1_Tick(object sender, EventArgs e)
{
// Process the default group
try
{
FSUIPCConnection.Process();
// IAS - Simple integer returned so just divide as per the
// FSUIPC documentation for this offset and display the result.
double airpeedKnots = ((double)airspeed.Value / 128d);
this.txtIAS.Text = airpeedKnots.ToString("f1");
double verticalspeedfpm = ((double)verticalspeed.Value * 60 * 3.28084 / 256); //gets vertical speed in meters per sec and converts it to feeet per min.
this.txtvsi.Text = verticalspeedfpm.ToString("f1"); //outputs it to a test box so i can see what the vertical speed is.
serialPort1.Open(); //opens serial port (com 4) - arduino
serialPort1.WriteLine(verticalspeedfpm.ToString("f1")); //sends the vertical speed data
read = (serialPort1.ReadLine()); // reads what the arduino sent back
serialPort1.Close();//closes the serial port
txtrecieved.Clear();//cleares the text box
this.txtrecieved.Text = read;//writes what was recieved
// Avionics Master Switch
this.chkAvionics.Checked = (avionics.Value > 0); // 0 = Off, 1 = On.
这里是arduino代码,简单地回复消息:
int vsint;
String vsstring;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
vsstring = Serial.read();
delay(10);
Serial.println(vsstring);
}
the windows form - the call back box should be equal to the vs box.
答案 0 :(得分:1)
void loop() {
// put your main code here, to run repeatedly:
vsstring = Serial.read();
delay(10);
Serial.println(vsstring);
}
在循环中,您正在读取序列而不先检查是否有任何要读取的内容(可用())。当您调用Serial.read()并且接收缓冲区中没有任何内容时它返回-1。这就是-1来自的地方。
至于49,你得到的是因为你发送的数字是ascii文本。查看ascii表,看看你得到的数字是否突然变得毫无意义。您正在从Serial读取字符串而不是char。 read()返回一个int。 String确实允许在RHS上的int =。当它看到一个时,它将int转换为ascii。所以你得到ascii代码的ascii表示。