2015-07-13 77 views
2

我正在使用串口應用程序發送帶有Unicode控制字符的命令,但沒有成功。當我在hyperterminal或Putty中發送相同的命令時,通信起作用,所以我很好奇這兩個程序是否寫出一個字節或Unicode字符數組,甚至是一個字符串。如果我模仿他們做什麼,我可能會成功......另外我注意到,我從Visual Studio中的工具箱中取出的串口屬性列爲使用我在代碼中寫入的不同COM端口,這就是爲什麼我沒有得到任何迴應,或者我的代碼覆蓋了嗎?在進行環回測試時,我得到了正確命令的輸出以及控制字符,所以我無法弄清楚我做錯了什麼。這是.NET 2.0 Framework FYISerialPorts:以字節或字符發送?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.IO.Ports; 
using System.Threading; 

namespace SimpleSerial 
{ 
    public partial class Form1 : Form 
    { 
     string RxString; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     private void buttonStart_Click(object sender, EventArgs e) 
     { 
      serialPort1.PortName = "COM3"; 
      serialPort1.BaudRate = 9600; 
      serialPort1.Parity = Parity.None; 
      serialPort1.DataBits = 8; 
      serialPort1.StopBits = StopBits.One; 
      serialPort1.Handshake = Handshake.None; 
      serialPort1.ReadTimeout = 500; 
      serialPort1.WriteTimeout = 500; 
      serialPort1.Open(); 
      if (serialPort1.IsOpen) 
      { 
       buttonStart.Enabled = false; 
       buttonStop.Enabled = true; 
       textBox1.ReadOnly = false; 
      } 
     } 
     const char STX = '\u0002'; 
     const char ETX = '\u0003'; 
     readonly string pull_shelf_104 = string.Format("{0}01P00104##{1}" , STX, ETX); 
     private byte[] WrapString(string pull_shelf_104) 
     { 
      return System.Text.Encoding.ASCII.GetBytes(pull_shelf_104); 
     } 
     private void linkLabel_HC1_100_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 
     { 
      if (serialPort1.IsOpen) 
      { 
       byte[] data = WrapString(pull_shelf_104); 
       serialPort1.Write(data, 0, data.Length); 
      } 
     } 
     private void buttonStop_Click(object sender, EventArgs e) 
     { 
      if (serialPort1.IsOpen) 
      { 
       serialPort1.Close(); 
       buttonStart.Enabled = true; 
       buttonStop.Enabled = false; 
       textBox1.ReadOnly = true; 
      } 
     } 
     private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
     { 
      if (serialPort1.IsOpen) serialPort1.Close(); 
     } 
     private void DisplayText(object sender, EventArgs e) 
     { 
      textBox1.AppendText(RxString); 
     } 
     private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
     { 
      RxString = serialPort1.ReadExisting(); 
      this.Invoke(new EventHandler(DisplayText)); 
     } 
    } 
} 
+0

您打開通訊端口發送/接收字節。這些字節是什麼(它們是否在某種編碼等等)取決於它們。膩子以終端模式(?)工作,所以它希望從調制解調器接收ASCII字符。關於com-ports,哦,大驚喜,它們可以是不同PC上的任何東西,意味着你不應該編寫「com3」''。您可以在設備管理器中更改com端口名稱,但這不會消除com端口識別問題。 – Sinatr

+0

'byte [] ackData = Encoding.ASCII.GetBytes(string here);'試試這個將starings轉換爲原始字節。 – hypheni

+0

您正在關注錯誤的問題。沒有很多使用Handshake.None的串口設備。當你使用它時,你需要將RtsEnable和DtrEnable屬性設置爲* true *。如果你不這樣做,那麼設備不會發送任何東西。 –

回答

0

上面的評論幫我解決了這個問題,謝謝你的幫助!我需要在我的代碼中啓用RTS和DTS,列出COM端口不是問題,雖然我確定它在某些情況下。這是我的代碼,用於任何有類似問題的人。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.IO.Ports; 
using System.Threading; 

namespace SimpleSerial 
{ 
    public partial class Form1 : Form 
    { 
     string RxString; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     private void buttonStart_Click(object sender, EventArgs e) 
     { 
      serialPort1.PortName = "COM3"; 
      serialPort1.BaudRate = 9600; 
      serialPort1.Parity = Parity.None; 
      serialPort1.DataBits = 8; 
      serialPort1.StopBits = StopBits.One; 
      serialPort1.Handshake = Handshake.None; 
      serialPort1.RtsEnable = true; 
      serialPort1.DtrEnable = true; 
      serialPort1.ReadTimeout = 2000; 
      serialPort1.WriteTimeout = 2000; 
      serialPort1.Open(); 
      if (serialPort1.IsOpen) 
      { 
       buttonStart.Enabled = false; 
       buttonStop.Enabled = true; 
       textBox1.ReadOnly = false; 
      } 
     } 
     const char STX = '\u0002'; 
     const char ETX = '\u0003'; 
     readonly string pull_shelf_104 = string.Format("{0}01P00204##{1}" , STX, ETX); 
     private byte[] WrapString(string pull_shelf_104) 
     { 
      return System.Text.Encoding.ASCII.GetBytes(pull_shelf_104); 
     } 
     private void linkLabel_HC1_100_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 
     { 
      if (serialPort1.IsOpen) 
      { 
       byte[] data = WrapString(pull_shelf_104); 
       serialPort1.Write(data, 0, data.Length); 
      } 
     } 
     private void buttonStop_Click(object sender, EventArgs e) 
     { 
      if (serialPort1.IsOpen) 
      { 
       serialPort1.Close(); 
       buttonStart.Enabled = true; 
       buttonStop.Enabled = false; 
       textBox1.ReadOnly = true; 
      } 
     } 
     private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
     { 
      if (serialPort1.IsOpen) serialPort1.Close(); 
     } 
     private void DisplayText(object sender, EventArgs e) 
     { 
      textBox1.AppendText(RxString); 
     } 
     private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
     { 
      RxString = serialPort1.ReadExisting(); 
      this.Invoke(new EventHandler(DisplayText)); 
     } 
    } 
}