2017-01-31 6 views
-1

私がしようとしているのはASCII値で1を送信することです。私のmkはそのcharを待っています。 ボタンを押しても何も起こりません。しかし、PORTを切り替えるためにバイトを送信すると、すべてが動作します。だから私はどのようにASCIIで、1値を送信するのだろうか。C#、マイクロコントローラでASCIIデータを送信

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

    private void button1_Click(object sender, EventArgs e) // Here i send a byte to MK 
    { 
     // serialPort1.RtsEnable = true; serialPort1.DtrEnable = true; 
     // var content = new List<byte>(); 
     // content.AddRange(Encoding.ASCII.GetBytes("1")); 
     // content.Add(3); // ASCII ETX 
     //byte[] buffer = content.ToArray(); 
     // serialPort1.Write(buffer, 0, buffer.Length);  
     serialPort1.Write("1"); 
    } 

    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
    } 

    private void button2_Click(object sender, EventArgs e) // choosing a right com port 
    { 
     serialPort1.PortName = textBox1.Text; 
     serialPort1.BaudRate = Convert.ToInt32(textBox2.Text); 
    } 

    string rs; 
    byte re; 

    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) // Da 
    { 
     try 
     { 
      //rs = serialPort1.ReadByte(); 
      //re = Convert.ToByte(serialPort1.ReadByte()); 
      rs = serialPort1.ReadExisting(); 
      // System.Text.Encoding.ASCII.GetString(new[] { re }); 
      this.Invoke(new EventHandler(type)); 
     } 
     catch (System.TimeoutException) { } 
    } 

    void type(object s,EventArgs e)    // receive data 
    { 
     textBox4.Text += rs; 
    } 

    private void button3_Click(object sender, EventArgs e) // OPen port 
    { 
     serialPort1.Open(); 
    } 

    private void button4_Click(object sender, EventArgs e) // Close port 
    { 
     serialPort1.Close(); 
    } 
} 
+0

コメントしたコードが正しい場合は、ETX charで送信を終了する必要があります。 – Gusman

+0

ASCII '1'は '0x31'ですので、' serialPort1.Write(0x31); 'を実行するだけで、@Gusmanはあなたに" "タイプのコマンドを送る必要があるかもしれないと言っていますが、' serialPort1.Write (0x03); 'デフォルトのウィンドウ文字列エンコーディングは' CP1252'ですので、文字列入力として '' 1 "'を送ると '0x31'の代わりに' 0x0031'が送られると思います。 –

+0

@ m.rogalski - SerialPortのデフォルトのエンコーディングはASCIIです。 ASCIIとCP1252の両方が "1"を0x31としてエンコードします。彼の問題はおそらく彼がETXのキャラクターを送っていないことでしょう。 – Joe

答えて

0

あなたはその方法でシリアルポートに文字列を書き込むことができます:ASCIIエンコーディングは、(あなたが設定することにより、エンコーディングを変更することができ、デフォルトで使用されているので、文字列が0x7Fの範囲の0x00からでASCII文字のみが含まれている必要がありますSerialPort.Encodingプロパティ)。

serialPort1.Write("1\x03"); 

のか、より一般的に、あなたがしたい場合:他の人がコメントで言ったように

、あなたは次のようにあなたが行うことができますコメントアウトコードを一致させるためにETX文字を追加する必要があります制御文字を含む文字列を作成する場合は、次のようにすることができます。

const char STX = '\x02'; 
const char ETX = '\x03'; 
... etc, other control characters you want to use 

... 

var s = String.Format("1{0}", ETX); 
serialPort1.Write(s); 
関連する問題