C#,在Microcotroller中发送ASCII数据

C#,在Microcotroller中发送ASCII数据,c#,serial-port,ascii,C#,Serial Port,Ascii,我要做的是用ASCII值发送1,我的mk正在等待那个字符。 但当我按下按钮时,什么也没发生。但当我发送一个字节来切换端口时,一切都正常。所以我想知道如何发送ASCII,1值 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) //

我要做的是用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();
    }
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
}
private void button1\u Click(objectsender,EventArgs e)//这里我向MK发送一个字节
{
//serialPort1.RtsEnable=true;serialPort1.DtrEnable=true;
//var content=新列表();
//content.AddRange(Encoding.ASCII.GetBytes(“1”));
//content.Add(3);//ASCII ETX
//字节[]缓冲区=content.ToArray();
//serialPort1.Write(buffer,0,buffer.Length);
serialPort1.写入(“1”);
}
私有void textBox1\u TextChanged(对象发送方,事件参数e)
{
}
私有无效按钮2\u单击(对象发送方,事件参数)//选择正确的com端口
{
serialPort1.PortName=textBox1.Text;
serialPort1.BaudRate=转换为32(textBox2.Text);
}
字符串rs;
字节re;
private void serialPort1\u DataReceived(对象发送方,SerialDataReceivedEventArgs e)//Da
{
尝试
{
//rs=serialPort1.ReadByte();
//re=Convert.ToByte(serialPort1.ReadByte());
rs=serialPort1.ReadExisting();
//System.Text.Encoding.ASCII.GetString(新[]{re});
调用(新的EventHandler(类型));
}
catch(System.TimeoutException){}
}
void类型(对象s,事件参数e)//接收数据
{
textBox4.Text+=rs;
}
私有无效按钮3\u单击(对象发送方,事件参数)//打开端口
{
serialPort1.Open();
}
私有无效按钮4\u单击(对象发送方,事件参数)//关闭端口
{
serialPort1.Close();
}
}

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

正如其他人在注释中所说,您需要附加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);

如果注释的代码正确,则必须使用ETX char结束传输。ASCII
1
is
0x31
,这样您就可以执行
serialPort1.Write(0x31)
和@Gusman所说的,这可能需要您发送一些“”类型的命令,在您的示例中,该命令是
serialPort1.Write(0x03)
默认的windows字符串编码是
CP1252
,因此我认为作为字符串输入发送
“1”
将发送
0x0031
,而不是
0x31
@m.rogalski-SerialPort的默认编码是ASCII。ASCII和CP1252都将“1”编码为0x31。他的问题可能是未能发送ETX字符。@Joe如果他
serialPort
流具有
ASCII
CP1252
编码,则应该是。但是如果它有
unicode
,那么我认为可能是这样。@m.rogalski-是的,你是对的,他明确地将SerialPort.Encoding配置为UTF16。