0

シリアルポートからバイトを読み取り、テキストボックスに文字列として書き込もうとしています。

私の問題は、コードが1つの長い文字列ではなく、各文字/文字をボックスに個別に書き込むことです.

public partial class Form1 : Form
    {
        static SerialPort serial;
        public string line;

        public Form1()
        {
            InitializeComponent();
        }



        private void Form1_Load(object sender, EventArgs e)
        {
            inputBox.Text = "Enter some text, then press enter";

            serial = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
            serial.Open();

            serial.DataReceived += new SerialDataReceivedEventHandler(serial_DataReceived);
        }



        public void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {

            // wait for the buffer
            System.Threading.Thread.Sleep(300);

                byte[] bytes = new byte[serial.BytesToRead];
                serial.Read(bytes, 0, bytes.Length);

                line = System.Text.Encoding.UTF8.GetString(bytes);

            if (line != null)
            {
                writeRecieved(line);
            }
        }


        public void writeRecieved (string line)
        {
            if (outputBox.InvokeRequired)
            {
                outputBox.Invoke((MethodInvoker)delegate { outputBox.Text = line; });
            }
            else
            {
                outputBox.Text = line;
            }
        }

ただし、デバッグ時には、これらの各行に 1 回しかヒットしないように見え、ローカル ビューでは変数行が「Hello」と表示されます。

編集: 追加 (outputBox.Text += 行;) を試みましたが、新しいメッセージを受信するたびにテキストボックスがテキストでいっぱいになります。outputBox. Clear(); を入れてみました。datarecieved ハンドラーで、ただし、何らかの理由で各バイトの後にこれを行います

4

1 に答える 1

2

お使いのコンピュータは、9600 bps よりもはるかに高速にデータを読み取ることができます。呼び出すと、その時点でserial.Readバッファ内にある文字をすべて読み取ります。

したがって、改行を取得するまで読み続けるか、コメントで提案されているようにして、読んだテキストをテキストボックスに追加する必要があります。

コメントでの質問に答えて、あなたが求めていることは不可能です。受信者は、送信者がテキストの終わりの文字を含まない限り、送信者がすべてのデータの送信を終了したことを知ることができません。送信者は を送信"Hello"し、すぐに"World". データは 1 文字ずつ受信されます。送信者が各単語の後に何らかのターミネータを送信しない限り、受信者への単なるバイト ストリームです。

はい、Thread.Sleepは非効率的であり、この種の用途には使用しないでください。

通常、この種のことは、送信者が各行の最後に改行文字を追加することで処理されます。受信者は文字を読み取り、受信したテキストを改行で分割して行を取得できます。

を使用するSleepと、問題が発生する可能性もあります。送信者が を送信"Hello""World"、何らかの理由でスレッドが 300 ミリ秒ではなくおそらく 4320 ミリ秒 (ビジーなシステムで発生する可能性があります) スリープし"HelloWo"、最初の単語として取得するとします。おっとっと。

于 2013-04-24T18:52:11.177 に答える