0

我做了一个小程序,女巫可以通过串口发送和接收。我的问题是,当我发送命令 ex: "netcfg" 我得到这个回声:

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

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

所以我想要的输出是这样的:“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);
        }
    }
}
4

1 回答 1

1

ASCII 字符 8 是退格字符。看来,串行电缆另一端的程序正试图在重新打印之前删除在提示符下输入的字符,并将新字符添加到末尾。

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

你可能还会看到其他的东西。有一个 BEL 字符 (7?) 应该会导致终端发出哔哔声。还有其他角色用于其他事情......

如果您开始看到其他奇怪的东西,也有可能该设备希望用户(您)处理 VT100 或 ANSI 终端命令。如果是这种情况,您可能会看到类似^[12n的情况(^[在 Windows 中将 替换为带有大量字体的小方块。它是转义字符。

啊,BBS 的美好时光。

于 2013-07-01T20:40:41.790 回答