0

我正在尝试从串行端口读取字节并将它们作为字符串写入文本框。

我的问题是代码将每个字母/字符单独写入框中,而不是一个长字符串,所以如果我收到“Hello”它将写“H”,然后清除该框,然后是“e”..etc

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;
            }
        }

但是,在调试时,它似乎只命中了这些行中的每一行,并且本地视图将变量行显示为“Hello”

编辑: 我尝试追加(outputBox.Text += line;),但是每次收到新消息时文本框都会填满文本。我试着放一个 outputBox.Clear(); 在 datarecieved 处理程序中,但由于某种原因它在每个字节之后执行此操作

4

1 回答 1

2

您的计算机能够以比 9600 bps 快得多的速度读取数据。当它调用时,它会读取当时serial.Read缓冲区中可用的尽可能多的字符。

因此,您要么需要继续阅读,直到获得换行符,要么按照评论中的建议进行操作并将阅读的文本附加到文本框中。

针对您在评论中的问题,您所要求的内容是不可能的。除非发送者包含一些文本结束字符,否则接收者无法知道发送者何时完成发送所有数据。发件人可能会发送"Hello",然后立即跟进"World"。数据是按字符接收的。除非发送者在每个单词之后发送某种终止符,否则它只是一个字节流到接收者。

是的,这Thread.Sleep是低效的,不应该用于这种事情。

通常,这种事情是通过让发件人在每行的末尾添加换行符来处理的。然后接收器可以读取字符并在换行符上拆分接收到的文本以导出行。

使用 aSleep也会给你带来麻烦。假设发送方发送"Hello"后跟"World",由于某种原因,您的线程可能会休眠 4320 毫秒(可能发生在繁忙的系统上)而不是 300 毫秒,并且您得到"HelloWo"第一个单词。哎呀。

于 2013-04-24T18:52:11.177 回答