rs232通讯c#数据读取问题

本文关键字:读取 问题 数据 通讯 rs232 | 更新日期: 2023-09-27 18:04:51

关于与Melfa rv-2aj机器人的rs232通信,我有一个问题。我用ASCII发送命令,当机器人通过rs232回复时,我得到这样的东西:??QY?e0? ?L?? 0???我的第一个想法是,当我从RS232读取时,我没有从ASCII进行适当的转换,但是如果我将这组字符转换为unicode输出,我会得到一些中文字符,这应该是不对的。由于机器人通过rs232发送回复,这让我觉得我的实现并没有错,但可能我的方法有一些错误。我认为"?"表示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 = "";
        }
    }
}

}

rs232通讯c#数据读取问题

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