当前位置: 首页 > 知识库问答 >
问题:

从串行端口读取换行符,返回第一个值

陆信瑞
2023-03-14

我试图从一个串行端口读取数据,这个端口连接着Arduino和操纵杆。

当试图打印出接收到的数据以检查我是否得到它时,它会继续打印出与连接时相同的值。

我正在从我的串行端口以这种格式发送数据: Xaxis: yAxis: SwitchBool

这是我在WPF应用程序中的C#代码

public partial class MainWindow : Window {

  public Timer loopTimer;
  string comport = "COM7";
  SerialPort sp;

  public MainWindow() {
    InitializeComponent();
    SetTimer();
    OpenPort();
  }

  private void SetTimer() {
    //Setup the timer
    loopTimer = new Timer(500);
    // Hook up the Elapsed event for the timer. 
    loopTimer.Elapsed += TryRead;
    loopTimer.AutoReset = true;
    loopTimer.Enabled = false;
  }

  public void OpenPort() {
    sp = new SerialPort();
    try {
      string portName = comport;
      sp.PortName = portName;
      sp.BaudRate = 9600;
      sp.Open();
      Debug.WriteLine("Connected");
      loopTimer.Enabled = true;
    }
    catch (Exception) {
      MessageBox.Show("Please give a valid port number or check your connection");
      loopTimer.Enabled = false;
    }
  }

  public void TryRead(object sender, EventArgs e) {
    string s = sp.ReadLine();
    Debug.WriteLine(s);
    Debug.WriteLine("-");
  }
} 

这是我的arduino代码:

int xPin = A1;
int yPin = A0;
int swPin = A2;
float deadzone = .05;

void setup() {
  Serial.begin(9600);
  pinMode(swPin, INPUT);
}

void loop() {
  float xVal =  (((analogRead(xPin) + 1) / 1023.) * 2) -1;
  if (xVal < deadzone && xVal > -deadzone ) {
    xVal = 0; 
  }

  float yVal =  (((analogRead(yPin) + 1) / 1023.) * 2) -1;
  if (yVal < deadzone && yVal > -deadzone ) {
    yVal = 0; 
  }

  int swVal = analogRead(swPin);
  bool switchDown;

  if (swVal == 0) {
    switchDown = true;
  } else {
    switchDown = false;
  }
   
  Serial.println( String(xVal) + ":" + String(yVal) + ":" + switchDown);
} 

下面是一个例子,说明在移动拇指时,Arduino的串行监视器中的数据应该是什么样子的:

-1.00:0.70:0
-0.80:0.50:0
-0.70:0.60:0

运行上面的C#代码,不移动拇指,我每次阅读时只会得到0.00:0.00:0.00,如果在开始之前移动它,我只会收到任何值。

共有1个答案

纪枫
2023-03-14

而不是每隔一段时间阅读,我只会在新数据到达总线时阅读。下面是一个如何做到这一点的例子。

SerialPort Port= new SerialPort("Com7");
Port.DataReceived+=OnSerialRecieve;
private void OnSerialRecieve(object sender, SerialDataReceivedEventArgs e)
{
    if ((sender as SerialPort).IsOpen)
    {
        string DataRecieved=(sender as SerialPort).ReadExisting();
    }
}

从那里你可以根据需要将其拆分。否则,如果您知道预期的确切数据量,您可以起诉SerialPort。ReadByte可准确读取所需的字节数。

 类似资料:
  • 问题内容: 我以下列方式从打开的串行端口读取某些数据时遇到麻烦。我已经多次使用此代码实例,并且一切正常,但是现在,由于某种原因,我无法弄清楚,我完全无法从串行端口读取任何内容。 我能够写,并且在另一端正确接收了所有消息,但是从未收到答复(正确发送)(不,电缆都还好;)) 我用来打开串行端口的代码如下: 端口初始化后,我通过简单的write命令向其中写入一些内容。 hCom是文件描述符(没关系),并

  • 我读了很多问题和答案,但没有找到任何解决方案。也许我的问题不对,但我需要一些指导。我在Linux中使用串行端口,从我的Arduino设备读取数据。每当我想从Arduino向Linux发送数据时,我首先发送两个字节,这表示将从Arduino发送的总字节数。我将这两个字节转换为整数值,并开始从串行端口读取数据。比如说,我想把300字节从Ardiuno发送到Linux,我只需要先写{1,44},然后用下

  • 我做了一个python程序,从串行端口读取gps数据。GPS冰球流NMEA数据语句连续插入USB时。我的程序打开端口,然后尝试读取数据,解析它,然后将其与从Arduino提取的其他数据一起写入文本文件。 我遇到的问题是,当我第一次运行程序时,有时它无法读取数据。我放入了一些Try/Exception捕获,发现以某种方式无法从GPS串行端口读取数据 如果我点击Cntrl-C几次,这似乎可以解决它遇到

  • 问题内容: 我想知道是否有一种方法可以通过PHP读取我的串行端口-可行:-) 在练习Arduino技能时,我开发了一个简单的LED ON / OFF草图。通过在串行监视器中 打开 或 关闭 它可以工作。 下一步,我整理了一个网页,充当GUI界面,以单击链接并执行上面的打开和关闭功能。该基于Web的GUI可通过PHP使用。我正在使用PHP SERIAL 类与Arduino使用的串行端口进行交互。 问

  • 我想知道是否有一种方法可以通过PHP来完成对串行端口的读取——有效:—— 在练习Arduino技能时,我设计了一个简单的LED开关示意图。它通过在串行监视器中输入on或off来工作。 下一步,我把一个网页放在一起,作为一个GUI界面,点击一个链接并执行上面的开关功能。这个基于网络的GUI通过PHP工作。我使用PHP串行类与Arduino使用的串行端口进行交互。 问题是我需要找到一种从串口获取反馈的

  • 问题内容: 我有一个Java程序,必须读取Arduino发送的信息。我从这里获取了Java代码。现在,我不太了解它是如何工作的,但是我尝试对其进行修改,并且得到了以下信息: 我创建一个对象串行COM口,我需要在主程序,然后我使用和当我需要它。 效果很好,Arduino获取数据并将其显示在LCD显示屏中。问题是。程序运行时,它会不断从串行端口读取数据(大约每40毫秒一次),但这并不意味着Arduin