0

AT コマンドの文字列を USB ドングルに送信しようとしています。シリアルポートへの書き込みに成功しました。しかし、私は読み返すことに成功していません。基本的に私がやりたいことは、AT をドングルに送信し、リッチテキスト ボックスで 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 に答える