在richtextbox中回读AT命令响应

时间:2013-06-26 15:55:18

标签: c# serial-port at-command

我正在尝试将一串AT命令发送到USB加密狗。我已成功写入串口。但我还没有成功回读。基本上我想做的是发送让我们说AT到加密狗并在richtextbox中接收OK。接下来将从另一台设备发送信息到加密狗并在richtextbox中读取它。

以下是我正在使用的代码:

namespace WindowsFormsApplication5
{
    public partial class Form1 : Form
    {
        SerialPort sp = null; //<---- serial port at form level

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            // initialise port in form loadmyport.PortName = "COM3";
            sp = new SerialPort();
            sp.PortName = "COM8";
            sp.BaudRate = 115200;
            sp.Parity = Parity.None;
            sp.DataBits = 8;
            sp.StopBits = StopBits.One;
            sp.NewLine = System.Environment.NewLine;
            sp.ReadTimeout = 2000;
            sp.WriteTimeout = 2000;
            sp.DtrEnable = false;
            sp.RtsEnable = false;
            sp.WriteBufferSize = 4096;
            sp.ReadBufferSize = 4096;
            sp.Handshake = Handshake.None;
            sp.Encoding = System.Text.Encoding.ASCII;

            // also set up baud rate etc here.
            // attach event handler to capture data received 
            sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
        }

        private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        Console.WriteLine("Data Received:");
        Console.Write(indata);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            connect.Enabled = false;
            try
            {
                // open port if not already open
                // Note: exception occurs if Open when already open.
                if (!sp.IsOpen)
                {
                    sp.Open();
                }
                // send data to port
                sp.Write("ATXXX,XXXXXXX\r\n");
                disconnect.Enabled = true;
            }
            catch (Exception)
            {

               // report exception to user
                Console.WriteLine(e.ToString());
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            connect.Enabled = true;

            try
            {
                // open port if not already open
                // Note: exception occurs if Open when already open.
                if (!sp.IsOpen)
                {
                    sp.Open();
                }
                // send data to port
                sp.Write("atXX,0\r\n");
            }
            catch (Exception)
            {

                Console.WriteLine(e.ToString());
            }
            finally
            {
                disconnect.Enabled = false;
            }
        }


        public void OnApplicationExit(object sender, EventArgs e)
        {
            sp.Close();
        }
    }
}

1 个答案:

答案 0 :(得分:3)

不要直接在主代码中从串口读取数据。您有一个用于数据接收事件的事件处理程序,它当前将响应写入调试控制台。您需要做的就是更改事件处理程序,将文本写入富文本框。 (您在文本框中读取数据并显示它的代码将永远不会显示任何内容,因为(a)port_DataRecieved看起来似乎永远不会订阅任何事件,因此它不会被调用,并且(b)您的sp_DataReceived事件处理程序正在读取数据并将其记录到调试输出,因此任何其他尝试读取端口的代码都会发现它“空”。

请注意,sp_DataReceived事件将在另一个线程而不是您的UI线程上引发,因此您需要Invoke或BeginInvoke将控制权传递回UI线程以将文本添加到文本框中。

另请注意,您可能无法将响应作为单个“数据包”获取。它可能会分成几个部分,因此您需要将每个传入的消息添加到文本框中文本的末尾,以便将您收到的所有部分的整个响应拼接在一起。