我做一个串口调试助手,想练习串口数据的发送,用的是VS自带的serialport控件,发送数据和接收数据程序如下,接收数据时候,乱码:如图
测试程序如下,主要指点串口的接收部分
        private void button3_Click(object sender, EventArgs e)      //发送数据
        {
            try
            {
                if ( txtSendMessage.Text=="")
                {
                    MessageBox.Show("发送信息为空", "消息提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                else
                {
                    if (spSend.IsOpen == true)
                    {
                        byte[] data = Encoding.Unicode.GetBytes(txtSendMessage.Text);
                        string str = Convert.ToBase64String(data);
                        spSend.Write(str);
                    }
                    else
                    {
                        MessageBox.Show("串口没有打开", "消息提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return;
                    }
                   
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }
        }
        private void spReceive_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (spReceive.IsOpen == false)         //如果串口关闭的,那么返回
                return;
            try
            {
                IsRecieve = true;
                int n = spReceive.BytesToRead;  //获得接收缓冲区的字节数
                if (n < 1)
                {
                    IsRecieve = false;
                    return;
                }
                byte[] buf = new byte[n];//声明一个临时数组用来存放当前来的串口数据,长度由读取到的字节决定
                spReceive.Read(buf, 0, n);//读取缓冲区数据
             
                rhbReceive.Invoke(new EventHandler(delegate
                    {
                        rhbReceive.Text = Encoding.UTF8.GetString(buf);
                    }));
                 }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                return;
            }
            finally
            {
                Listening = false;
                
            }
        }

解决方案 »

  1.   

    rhbReceive.Text = Encoding.UTF8.GetString(buf);
    试试其他的编码格式
      

  2.   

    1.string str = Convert.ToBase64String(data);这句话多余了。SerialPort可以直接传byte[]。即使你想用string参数,用txtSendMessage.Text就行了。
    2.发送和接收的编码不一致。发送是Encoding.Unicode,接收是Encoding.UTF8
      

  3.   

    试了,不过如果把发送部分改为: spSend.WriteLine(str); //发送数据
    而且接收部分,上面 都去掉 只要byte[] data = Convert.FromBase64String(spReceive.ReadLine());
    结果可以显示,好奇怪,给解释
      

  4.   


    如果我按照你说的,直接发送部分:                       
                            byte[] data = Encoding.Unicode.GetBytes(txtSendMessage.Text); //将发送的内容编码成一个发送的字符序列
                            //string str = Convert.ToBase64String(data);
                            //spSend.Write(str);
                            spSend.WriteLine(data); //发送数据
    会报错:错误 参数“1”: 无法从“byte[]”转换为“string”
                    与“System.IO.Ports.SerialPort.WriteLine(string)”最匹配的重载方法具有一些无效参数
      

  5.   


    如果我按照你说的,直接发送部分:                       
                            byte[] data = Encoding.Unicode.GetBytes(txtSendMessage.Text); //将发送的内容编码成一个发送的字符序列
                            //string str = Convert.ToBase64String(data);
                            //spSend.Write(str);
                            spSend.WriteLine(data); //发送数据
    会报错:错误 参数“1”: 无法从“byte[]”转换为“string”
                    与“System.IO.Ports.SerialPort.WriteLine(string)”最匹配的重载方法具有一些无效参数
    //发送byte[]
    spSend.Write(data,0,data.Length);
      

  6.   


    如果我按照你说的,直接发送部分:                       
                            byte[] data = Encoding.Unicode.GetBytes(txtSendMessage.Text); //将发送的内容编码成一个发送的字符序列
                            //string str = Convert.ToBase64String(data);
                            //spSend.Write(str);
                            spSend.WriteLine(data); //发送数据
    会报错:错误 参数“1”: 无法从“byte[]”转换为“string”
                    与“System.IO.Ports.SerialPort.WriteLine(string)”最匹配的重载方法具有一些无效参数
    //发送byte[]
    spSend.Write(data,0,data.Length);发送函数可以这样写:                       
                          byte[] data = Encoding.Unicode.GetBytes(txtSendMessage.Text); //将发送的内容编码成一个发送的字符序列
                            spSend.Write(data,0,data.Length);那么接收函数,应该怎么写呢,我的是这样的:
                    byte[] data = Convert.FromBase64String(spReceive.ReadLine());
                 
                    rhbReceive.Invoke(new EventHandler(delegate
                        {
                              rhbReceive.Text = Encoding.UTF8.GetString(data);
                        }));
    结果说超时,但是我不想用这种接收方法:我想用,
                   IsRecieve = true;
                    int n = spReceive.BytesToRead;  //获得接收缓冲区的字节数
                    if (n < 1)
                    {
                        IsRecieve = false;
                      return;
                    }
                    byte[] buf = new byte[n];//声明一个临时数组用来存放当前来的串口数据,长度由读取到的字节决定
                    spReceive.Read(buf, 0, n);//读取缓冲区数据
    接下来我就不会处理了