2013-09-17 6 views
1

У меня есть плата arduino, которая подключена к FSR. Он должен вернуть информацию о текущем давлении. Эти данные передаются через COM5 и затем анализируются в моей программе C#. Датчик будет возвращать значения от 0 до 1023.Чтение из последовательного порта возвращает неправильные значения

Это мой Arduino код (может быть не важно)

int FSR_Pin = A0; //analog pin 0 

void setup(){ 
    Serial.begin(9600); 
} 

void loop(){ 
    int FSRReading = analogRead(FSR_Pin); 

    Serial.println(FSRReading); 
    delay(250); //just here to slow down the output for easier reading 
} 

Мой C# Последовательный порт чтения выглядит следующим образом:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO.Ports; 
using System.Windows.Forms; 


namespace Serial_Reader 
{ 
    class Program 
    { 

     // Create the serial port with basic settings 
     SerialPort port = new SerialPort("COM5", 
      9600); 



     static void Main(string[] args) 
     { 
      new Program(); 

     } 

     Program() 
    { 

     Console.WriteLine("Incoming Data:"); 
     // Attach a method to be called when there 
     // is data waiting in the port's buffer 
     port.DataReceived += new 
     SerialDataReceivedEventHandler(port_DataReceived); 

     // Begin communications 
     port.Open(); 

     // Enter an application loop to keep this thread alive 
     Application.Run(); 
    } 

    private void port_DataReceived(object sender, 
     SerialDataReceivedEventArgs e) 
    { 
     // Show all the incoming data in the port's buffer 

     Console.WriteLine(port.ReadExisting()); 
    } 

    } 
} 

В этом случай жму датчика и освободить его

консоль Вывод на Arduino:

0 
0 
0 
0 
285 
507 
578 
648 
686 
727 
740 
763 
780 
785 
481 
231 
91 
0 
0 
0 
0 
0 

Тот же сценарий в C#

0 

0 

0 

0 

55 
3 

61 
1 

6 
46 

666 

676 

68 
4 

69 
5 

6 
34 

480 

78 

12 

0 

0 

0 

0 

У меня нет абсолютно никакого опыта работы с последовательными портами, но это выглядит как поток .... «асинхронный» ... как есть еще один байт для чтения, но приемник не поймет этого.

Что я могу сделать по этому поводу?

ответ

3

Вы получаете ответ усеченным (например, 553, который становится 55\n3), потому что вы печатаете, как только DataReceived поднят, что может произойти до конца строки.

Вместо этого, вы должны использоваться ReadLine() в цикле:

Console.WriteLine("Incoming Data:"); 

port.Open(); 

while (true) 
{ 
    string line = port.ReadLine(); 

    if (line == null) // stream closed ? 
     break; 

    Console.WriteLine(line); 
} 

port.Close(); 

Это также должен решить проблему двойного разрыва линии, потому что ReadLine() должны есть \n приходить из COM-порта.

+0

Привет, Я попытался использовать readline, и мой код для строки всегда равен нулю. Но когда я использую сериал в python, он работает. Вы не знаете, почему это так? –

Смежные вопросы