【问题标题】:C#, Send ASCII data in MicrocotrollerC#,在微控制器中发送 ASCII 数据
【发布时间】:2017-01-31 10:35:05
【问题描述】:

我正在尝试以 ASCII 值发送1,我的 mk 正在等待那个字符。 但是当我按下一个按钮时,什么也没有发生。但是当我发送一个字节来切换端口时,一切正常。所以我想知道如何发送 ASCII,1 值。

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();
    }
}

【问题讨论】:

  • 如果注释代码是正确的,那么您必须以 ETX 字符结束传输。
  • ASCII 10x31 所以你可以做serialPort1.Write(0x31); 并且正如@Gusman所说,这可能需要你发送一些“”类型的命令,在你的情况下是@ 987654327@ 默认windows字符串编码是CP1252,所以我认为发送"1"作为字符串输入会发送0x0031而不是0x31
  • @m.rogalski - SerialPort 的默认编码是 ASCII。 ASCII 和 CP1252 都将“1”编码为 0x31。他的问题可能是他没有发送 ETX 字符。
  • @Joe 如果他的serialPort 流具有ASCIICP1252 编码,那么它应该。但如果它有unicode,那么我认为可能是这样。
  • @m.rogalski - 是的,你是对的,万一他明确将 SerialPort.Encoding 配置为 UTF16。

标签: c# serial-port ascii


【解决方案1】:

您可以通过这种方式将字符串写入串行端口:字符串必须仅包含 0x00 到 0x7F 范围内的 ASCII 字符,因为默认使用 ASCII 编码(您可以通过设置 SerialPort.Encoding 属性来更改编码)。

正如其他人在 cmets 中所说,您需要附加 ETX 字符以匹配注释掉的代码,您可以这样做:

serialPort1.Write("1\x03");

或者,更一般地说,如果你想构建一个包含控制字符的字符串,你可以这样做:

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多