0

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

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

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();
        }
    }
}
4

1 回答 1

3

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

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

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

于 2013-06-26T18:52:11.907 回答