2013-03-03 3 views
0

안녕하세요, 저는 Arduino에서 직렬 입력을 읽으려고하고 있지만 운이 없습니다. 나는 연결을 올바르게 열고 닫을 것이라고 믿지만 많은 성공을 거두지는 않습니다!Arduino에서 C# 코드를 읽지 못했습니다.

나는 Arduino가 시리얼 터미널에서 볼 수 있기 때문에 데이터를 출력하고 있다고 확신한다.

내 C# 프로그램의 코드는 아래와 같습니다. 누군가 놓친 실수를 발견 할 수 있는지 궁금합니다.

은 또한이 내가 받아야하는 직렬 데이터의 예입니다 "12.2,1111,332,233"난 그냥 당신이, 당신이 경우 수정해야합니다 같은 일에 일하는

namespace FridgeProtectionDeviceMonitor 
{ 
    public partial class Online_mode : Form 
    { 

     public Online_mode() 
     { 
      InitializeComponent(); 
     } 

     private void Online_mode_Load(object sender, EventArgs e) 
     { 
      cmbPortSelection.DataSource = SerialPort.GetPortNames(); 
      cmbChartSelection.SelectedIndex = 0; 
     } 

     string x = ""; 
     SerialPort port; 

     private void btnFindPorts_Click(object sender, EventArgs e) 
     { 
      var ports = SerialPort.GetPortNames(); 
      cmbPortSelection.DataSource = ports; 
     } 

     private void btnOpenPort_Click(object sender, EventArgs e) 
     { 
      if (cmbPortSelection.SelectedIndex > -1) 
      { 
       port = new SerialPort(cmbPortSelection.Text); 
       try 
       { 
        if (!port.IsOpen) 
        { 
         port.BaudRate = 9600; 
         port.Open(); 
        } 
       } 
       catch (Exception) 
       { 
        MessageBox.Show("Serial connection request denied: Port is in use!"); 
       } 
      } 
      else 
      { 
       MessageBox.Show("Serial connection request denied: No port selected!"); 
      } 
     } 

     private void btnClosePort_Click(object sender, EventArgs ex) 
     { 

      try 
      { 
       port.Close(); 

      } 
      catch (Exception) 
      { 
       MessageBox.Show("Serial close connection request denied: ", ex.ToString()); 
      } 
     } 

     private void update(object sender, EventArgs e) 
     { 
      txtSaveLocation.Text = x; 
     } 

     private void port_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
     { 
      x = port.ReadLine().ToString(); 
      MessageBox.Show(x); 
      this.Invoke(new EventHandler(update)); 

     } 
    } 
} 

답변

0

귀하의 목적을 위해 그것을 사용하고 싶습니다,하지만 여기에 내가 사용하는 코드가 있습니다. 유일한 문제는 나에게 그것은 속도계와 일종의 지연 (누군가는 이유를 아는가?) 때문에 매우 빨리 읽을 필요가 있지만 어쨌든 여기 저의 코드는 저에게 맞습니다.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     public void Form1_Load(object sender, EventArgs e) 
     { 
      try 
      { 
       if (arduinoCom.IsOpen == false) 
       { 
        arduinoCom.Open(); 
       } 
      } 

      catch 
      { 
       MessageBox.Show("Serial Error: Is your serial plugged in?"); 
      } 

     } 

     private void refresh_Tick(object sender, EventArgs e) 
     {    
      string speedReading = arduinoCom.ReadLine(); 
      speed.Text = speedReading; 
     } 

     private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
     { 
      arduinoCom.Close(); 
     } 

    } 
} 
0

내가 PIC 마이크로 컨트롤러에 연결된 XBee 무선 브리지에 연결된 시리얼 변환기에 USB있어 그리고 난 직렬 포트를 실행하면 통신이 뭔가 만성 속도를 증가시키는 별도의 스레드에서 함수를 읽는 것으로 나타났습니다!

개행 문자가 수신 될 때까지 readline이 코드를 차단하므로 주 스레드가 차단됩니다. 다른 스레드로 이동하기 전에 내 GUI가 응답하지 않게되었습니다. 그런데 ReadByte()를 사용하고 있습니다.

백그라운드 워커의 직렬 버퍼에서 연속적으로 바이트를 읽고 스레드 안전 큐에 저장하고 있습니다. 그런 다음 큐의 통신 시작 비트를 확인하고 거기에서 패킷을 분석하십시오. 수동 재설정 이벤트를 사용하여 모든 것을 동기화하고 있습니다.

내 경험상 port_datareceived 이벤트는 serialport 클래스에 추가 된 것이지만 불행히도 빠른 통신에는 상대적으로 쓸모가 없습니다. 나는 12900 보오에서 달리고있다.

코드 스 니펫이 필요한 경우 제공 할 수 있습니다.

감사합니다, 피트

P.S. 멀티 채널 소프트웨어와 함께 ATS5004D 4 채널 차동 오실로스코프를 사용하고 있습니다. 다중 채널 소프트웨어는 직렬 분석기 블록을 통해 전압 신호를 직렬 데이터로 분석 할 수 있습니다. 그렇게하면 시리얼 통신 라인에서 실제로 논의되는 것을 볼 수 있습니다 !! 모든 BS 다른 직렬 단자를 잘라내십시오.

0

@ 마이클 B. 실재 전달이 무엇인지보고 즉, TX RX 선을 조사하여 arduino 보드가 무엇을 내고 있는지 확인합니다. 나는 arduino에 대한 경험이 거의 없지만 PICAXE 시스템의 디버그 기능을 통해 이전 버전과 마찬가지로 모든 것을 느리게하는 힙이 발생했습니다.

초당 몇 번씩 속도를 업데이트 하시겠습니까? SAE J1939 자동차 직렬 통신 표준에 따르면 RPM은 100ms마다 한 번만 업데이트하면됩니다. 인간의 눈은 보통 300ms보다 빠르게 반응하거나 반응 할 수 없습니다. 9600 보오는 대략 밀리 초 당 8 비트 바이트를 제공합니다.

개인적으로 나는 타이머를 사용하여 업데이트를 얻지 않고 main에서 별도의 스레드로 모든 것을 수행하고 원하는만큼 빠르거나 느리게 실행되도록합니다.

이 스레드 내가 내 통신

희망 System.IO.IOException: A device attached to the system is not functioning C# .NET 4.0이 도움이, 피트

을 설정 한 약 방법을 보여줍니다
관련 문제