2010-06-28 124 views
-2

我想發送字符'a'到串口。發送字符到串口

我想:

serialPort1.WriteLine("a"); 

,但它不是實際發送字符 'a' 到我的板。

任何想法?

+1

什麼樣的設備正在嘗試連接?它是否實施某種協議? – Fernando 2010-06-28 18:08:55

+0

未設置握手屬性將被猜測#1。 – 2010-06-28 18:15:46

+0

它應該發送三個字符「a」和換行符(CR LF)。 – dbasnett 2010-06-29 10:10:43

回答

0

你怎麼知道它是不發送的字符?是否可能波特率/字長/奇偶校驗設置關閉,並且您的主板不能識別字符?

另外,爲什麼c#?這似乎是硬件IO的一個奇怪選擇。

+0

爲什麼它很奇怪?或者我應該使用什麼。對不起,我是一個新手... – jan 2010-06-28 18:14:36

+0

你可以隨意使用任何你喜歡的,語言取決於解決方案。 C#離HW很遠,但這只是我個人的偏見:)過去我對C和Python有很好的經驗。 – 2010-06-28 18:17:47

+1

+1 ....我根本沒有理由爲什麼這個答案被拒絕投票 - 它是一個合適的答案... – Dal 2010-06-29 18:05:18

2

我分享給你一個由我創建的課程,在一個生產性項目中。它處理串行連接和讀寫緩衝區:

public class CommSERIAL : IComm 
    { 

     #region Events 

     public event EventHandler EvtOnConnect; 
     public event EventHandler EvtOnDisconnect; 


     public event EventHandler<OnDataReceivedEventArgs> EvtOnDataReceived; 

     #endregion 

     System.IO.Ports.SerialPort Rs232 = new System.IO.Ports.SerialPort(); 


     private string m_Port; 

     public string Port 
     { 
      get { return m_Port; } 
      set { m_Port = value; } 
     } 
     private int m_Baud; 

     public int Baud 
     { 
      get { return m_Baud; } 
      set { m_Baud = value; } 
     } 

     private int m_DataBit; 

     public int DataBit 
     { 
      get { return m_DataBit; } 
      set { m_DataBit = value; } 
     } 

     private System.IO.Ports.StopBits m_stopBits; 

     public System.IO.Ports.StopBits StopBits 
     { 
      get { return m_stopBits; } 
      set { m_stopBits = value; } 
     } 

     private System.IO.Ports.Parity m_parity; 

     public System.IO.Ports.Parity Parity 
     { 
      get { return m_parity; } 
      set { m_parity = value; } 
     } 


     public void Connect() 
     { 
      if (!(Rs232.IsOpen)) 
      { 
       Rs232.PortName = this.Port; 
       Rs232.BaudRate = this.Baud; ; 
       Rs232.DataBits = this.DataBit; 
       Rs232.StopBits = this.StopBits; 
       Rs232.Parity = this.Parity; 
       Rs232.ReadTimeout = 5000; 
       Rs232.Handshake = System.IO.Ports.Handshake.None; 
       Rs232.ReadTimeout = 1000; 
       Rs232.WriteTimeout = 500;    

       Rs232.Open(); 


      } 
     } 

     public void Disconnect() 
     { 
      Rs232.Close(); 
      if (EvtOnDisconnect != null) 
       EvtOnDisconnect(new object(), new System.EventArgs()); 

      m_Connected = false; 
     } 


     public CommSERIAL() 
     { 
      this.ConnType = ConnType.Direct; 

     } 


     public bool Connected 
     { 
      get 
      { 
       return m_Connected; 

      } 
     } 


     private ConnType m_ConnType; 

     public ConnType ConnType 
     { 
      get { return m_ConnType; } 
      set { m_ConnType = value; } 
     } 

     public string ReadOnByte(int Lenght,char EndChar) 
     { 
      char[] bytes = new char[Lenght]; 
      string ret = ""; 
      int numBytesRead = 0; 
      while (bytes[numBytesRead] != EndChar && numBytesRead <= bytes.Length) 
      { 
       while (Rs232.Read(bytes, numBytesRead, 1) == 1 && bytes[numBytesRead] != EndChar && numBytesRead <= bytes.Length) 
       { 
        numBytesRead++; 
       } 
      } 

      foreach (char b in bytes) 
       ret += b.ToString(); 
      return ret.Substring(0,numBytesRead); 


     } 

     public String ReadBuffer() 
     { 

      try 
      { 
       if (Rs232.IsOpen) 
       { 

        Byte[] readBuffer = new Byte[Rs232.ReadBufferSize + 1]; 

        try 
        { 
         // If there are bytes available on the serial port, 
         // Read returns up to "count" bytes, but will not block (wait) 
         // for the remaining bytes. If there are no bytes available 
         // on the serial port, Read will block until at least one byte 
         // is available on the port, up until the ReadTimeout milliseconds 
         // have elapsed, at which time a TimeoutException will be thrown. 
         Int32 count = Rs232.Read(readBuffer, 0, Rs232.ReadBufferSize); 

         String SerialIn = System.Text.Encoding.ASCII.GetString(readBuffer, 0, count); 

         return SerialIn; 

        } 
        catch (TimeoutException) { return ""; } 

       } 
       else 
       { 
        Thread.Sleep(50); 
        return ""; 
       } 
      } 
      catch (Exception ex) 
      { 
       throw new Exception(ex.Message); 
      } 

     } 
     public string Read() 
     { 
      return Rs232.ReadExisting(); 
     } 

     public string ReadAll() 
     { 

      //TO DO 
      return ""; 
     } 

     public void Write(string Data) 
     { 
      if (Rs232 == null) 
       throw new Exception("Must be connected before Write"); 

      if (!Rs232.IsOpen) 
       throw new Exception("Must be opened before Write"); 

      Rs232.Write(Data); 
     } 

     public void ClearBuffer() 
     { 
      Rs232.DiscardInBuffer(); 
     } 


     private bool m_Connected; 


     #region IComm Members 


     private int m_Id; 

     public int Id 
     { 
      get 
      { 
       return m_Id; 
      } 

      set 
      { 
       m_Id = value; 
      } 
     } 

     #endregion 

     public override string ToString() 
     { 
      return this.ConnType.ToString(); 
     } 

     #region IComm Members 



     #endregion 
    } 

公共接口ICOMM { ConnType ConnType { 搞定; 集; }

bool Connected 
    { 
     get; 
    } 

    int Id 
    { 
     get; 
     set; 
    } 


    void Connect(); 
    void Disconnect(); 
    void Write(string Data); 
    string Read(); 
    string ReadOnByte(int Lenght, char EndChar); 
    String ReadBuffer(); 
    void ClearBuffer(); 
    string ReadAll(); 
    event EventHandler EvtOnConnect; 
    event EventHandler EvtOnDisconnect; 
    event EventHandler<EventArgs.OnDataReceivedEventArgs> EvtOnDataReceived; 
} 

我希望對你有用