c#Serial-port:接收一些回声

时间:2013-07-01 12:21:42

标签: c# serial-port echo

我制作了一个小程序,可以通过串口发送和接收。 我的问题是,当我发送命令ex:“netcfg”时,我得到了这个回声:

http://i44.tinypic.com/izx92p.png

在空格处显示UTF8代码08.如果转换为java脚本,则显示:\ b 但输出必须是:netcfg,而不是:n net net netc netcf netcfg

所以输出我想要这样的loks: “sds://> netcfg”然后换行。

我可以看到设备理解我的命令,但这看起来不太好,所以请帮助我。

我的代码现在很乱,但无论如何它仍然存在:

using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        private string _TerminalString;

        public Form1()
        {
            InitializeComponent();
            if (!mySerialPort.IsOpen)
            {
                mySerialPort.Open();
                txtTerminal.Text = "The port is now open";
            }
            else
            {
                txtTerminal.Text = "The port is in use";
            }
        }

        private void mySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            _TerminalString = mySerialPort.ReadExisting();

            Invoke(new EventHandler(displayText));
        }

        private void displayText(object o, EventArgs e)
        {
            byte[] str2 = Encoding.ASCII.GetBytes(txtSend.Text);
            var testList = new List<byte>(str2);
            testList.Add(0x0D);
            byte[] str3 = testList.ToArray();
            mySerialPort.Write(str3, 0, str3.Length);
            txtTerminal.AppendText(_TerminalString);
        }

        private void bSend_Click(object sender, EventArgs e)
        {
            byte[] str2 = Encoding.ASCII.GetBytes(txtSend.Text);
            var testList = new List<byte>(str2);
            testList.Add(0x0D);
            byte[] str3 = testList.ToArray();
            mySerialPort.Write(str3, 0, str3.Length);
        }

        private void bClear_Click(object sender, EventArgs e)
        {
            txtTerminal.Clear();
            txtSend.Clear();
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            mySerialPort.Close();
        }


        private void btnSearchForComPorts_Click(object sender, EventArgs e)
        {
            string[] ports = SerialPort.GetPortNames();
            foreach (string port in ports)
            {
                cbmComPorts.Items.Add(port);
            }
        }

        private void btnSelectComPort_Click(object sender, EventArgs e)
        {
            if (mySerialPort.IsOpen)
            {
                mySerialPort.Close();
            }

            mySerialPort.PortName = cbmComPorts.Text;
            txtTerminal.AppendText(cbmComPorts.Text);
            mySerialPort.Open();
        }

        private void btnNetcfg_Click(object sender, EventArgs e)
        {
            // netcfg + enter
            byte[] str = {0x6E, 0x65, 0x74, 0x63, 0x66, 0x67, 0x0D, 0x0A};

            mySerialPort.Write(str, 0, str.Length);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

ASCII字符8是退格符。您的串行电缆另一端的程序似乎正在尝试删除在重新打印传入的东西时输入的字符,并将新角色添加到最后。

更改程序以检测何时收到ASCII 8,然后删除最后一个字符并将光标位置向后移动一个。如果你退回到一个换行线,可能会很棘手...如果你已经在左边缘,我会忽略它。

您可能也会看到其他内容。有一个BEL字符(7?)会导致终端发出蜂鸣声。其他的东西还有其他的东西......

如果你开始看到其他奇怪的东西,这个设备也希望用户(你)能够处理VT100或ANSI终端命令。如果是这种情况,你可能会看到像^[12n这样的东西(用Windows中的很多字体替换^[一个小方块。它是转义字符。

啊,BBS的好日子。