rs232通信C#数据读取问题

时间:2014-05-24 17:09:58

标签: c# serial-port

我有关于与Melfa rv-2aj机器人进行rs232通信的问题。我发送到ASCII命令,当机器人通过rs232回复我得到这样的东西:?? QY?e0?L ??? 0 ??? 0 ???我的第一个想法是,当我从RS232读取时,我没有从ASCII进行正确的转换,但如果我将这组字符转换为unicode输出,我会得到一些中性字符,这应该是正确的。当机器人通过rs232发送回复时,让我觉得我的实现没有错,但也许我的approch有一些错误。我想"?"表示未正确显示的ASCII字符。

下面我已将源代码附加到我的应用程序中。 当我从序列中读到我得到他的那种输出时,有人可以指出我做错了什么吗? 我真的很感激任何帮助,建议或参考。 非常感谢你。

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


namespace RS232_Communication
{
public partial class Form1 : Form
{
    private SerialPort COM_port = new SerialPort();
    private byte[] _array = new byte[] {0};
    public Form1()
    {
        InitializeComponent();
        BAUDRate.Items.Add("2400");
        BAUDRate.Items.Add("4800");
        BAUDRate.Items.Add("9600");
        BAUDRate.Items.Add("14400");
        BAUDRate.Items.Add("19200");
        BAUDRate.Items.Add("28800");
        BAUDRate.SelectedIndex = 2;

        DATAUnit.Items.Add("5");
        DATAUnit.Items.Add("6");
        DATAUnit.Items.Add("7");
        DATAUnit.Items.Add("8");
        DATAUnit.Items.Add("9");
        DATAUnit.SelectedIndex = 3;

        ParityUnit.Items.Add("None");
        ParityUnit.Items.Add("Odd");
        ParityUnit.Items.Add("Even");
        ParityUnit.Items.Add("Mark");
        ParityUnit.Items.Add("Space");
        ParityUnit.SelectedIndex = 2;

        STOPUnit.Items.Add("One");
        STOPUnit.Items.Add("Two");
        STOPUnit.SelectedIndex = 1;

        this.Load += new EventHandler(Form1_Load);
        SendText.KeyPress +=new KeyPressEventHandler(SendText_KeyPress);
        COM_port.DataReceived +=new SerialDataReceivedEventHandler(COM_port_DataReceived);
    }

    private string GetString(byte[] bBuffer, int iIndex, int iLen, bool bUni)
    {
        string sBuffer;
        if (bUni) sBuffer = Encoding.Unicode.GetString(bBuffer, iIndex, iLen);
        else sBuffer = Encoding.ASCII.GetString(bBuffer, iIndex, iLen);
        //return the string
        return sBuffer;
    }

     void COM_port_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        ReceiveText.Invoke(new EventHandler(delegate
            {
                byte[] data = new Byte[COM_port.BytesToRead];
                COM_port.Read(data, 0, data.Length);
                //string read = GetString(data, 0, data.Length, true);
                 string read = System.Text.Encoding.ASCII.GetString(data);



                ReceiveText.AppendText(read);

                //ReceiveText.AppendText(COM_port.ReadExisting());
            }
         )
         )
         ;

    }

    void Form1_Load(Object sender, EventArgs e)
    {
        foreach (string COMstr in SerialPort.GetPortNames())
            COMPort.Items.Add(COMstr);

        if (COMPort.Items.Count > 0)
            COMPort.SelectedIndex = 0;
        else MessageBox.Show("No COM Ports available");

    }

    private void ConnectBTN_Click(object sender, EventArgs e)
    {
        try
        {
            if (COM_port.IsOpen)
            {
                COMPort.Enabled = true;
                BAUDRate.Enabled = true;
                ParityUnit.Enabled = true;
                STOPUnit.Enabled = true;
                DATAUnit.Enabled = true;
                COM_port.DtrEnable = false;
                COM_port.RtsEnable = false;
                ConnectBTN.Text = "Connect";
                COM_port.Close();
            }
            else
            {
                COM_port.BaudRate = int.Parse(BAUDRate.Text);
                COM_port.Parity = (Parity)Enum.Parse(typeof(Parity), ParityUnit.Text);
                COM_port.StopBits = (StopBits)Enum.Parse(typeof(StopBits), STOPUnit.Text);
                COM_port.DataBits = int.Parse(DATAUnit.Text);
                COM_port.PortName = COMPort.Text;
               //COM_port.DtrEnable = true;
                //COM_port.RtsEnable = true;

                COM_port.Open();
                COM_port.ReadTimeout = 2000;
                COM_port.WriteTimeout = 2000;
                COMPort.Enabled = false;
                BAUDRate.Enabled = false;
                ParityUnit.Enabled = false;
                STOPUnit.Enabled = false;
                DATAUnit.Enabled = false;
                ConnectBTN.Text = "Disconnect";
            }

        }
        catch
        {
            MessageBox.Show("Connection Error");
        }
    }

    public void WriteBytes(byte[] array)
    {
        COM_port.Write(array, 0, array.Length);

    }

    public void WriteBytes(byte[] array, int index, int length)
    {
        COM_port.Write(array, index, length);
    }


    public void WriteLine(String line)
    {
        //string s="";
        //foreach (byte b in StringToBytes(line + "\r\n"))
        //    s = s + b.ToString();
        //COM_port.WriteLine(s);
        WriteBytes(StringToBytes(line + "\r\n"));//CR + LF

    }

    public static byte[] StringToBytes(string input)
    {
        return Encoding.ASCII.GetBytes(input);
    }

    private void SendBTN_Click(object sender, EventArgs e)
    {
        if (SendText.Text != "")
         {
            WriteLine(SendText.Text);
            //COM_port.WriteLine(SendText.Text);
            SendText.Text = "";
        }

    }

    void SendText_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == 13)
        {
            WriteLine(SendText.Text);
            //COM_port.WriteLine(SendText.Text);
            SendText.Text = "";
        }
    }

}

}

1 个答案:

答案 0 :(得分:1)

我设法找出问题所在。在rv-2aj的手册中指出,为了使用rs232通信,必须设置以下参数:波特率9600,奇偶校验,停止位2,数据位8.所以我以这种方式配置了我的通信,当我向控制器发送数据时,我会收到我在上一篇文章中显示的奇怪消息。似乎机器人侧的通信配置与我的不同,所以我将奇偶校验的值更改为无,并将停止位更改为1,现在一切都按预期工作。我从机器人那里获得了适当的反馈并且命令工作。我在c#中编写的代码工作正常,无需进行必要的修改。