c#串口奇数值?

时间:2017-10-08 12:46:34

标签: c# c++ arduino

我正在建立一个飞行模拟器,我有一个名为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.

1 个答案:

答案 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表示。