gpt4 book ai didi

c# - 显示从串口接收到的数据

转载 作者:行者123 更新时间:2023-11-30 21:56:25 25 4
gpt4 key购买 nike

我在使用串行数据接收事件处理程序时遇到问题。一半时间数据显示在文本框上,一半时间不显示。应该是跨线程操作的问题。

这是我的 Arduino 代码:

int Loop = 1;

void setup() {
Serial.begin(9600);
}

void loop() {
Serial.println(Loop);
Loop++;

delay(1000);
}

这是我的 C# 代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace arduino_test
{
public partial class Form1 : Form
{
SerialPort sPort;

public Form1()
{
InitializeComponent();

initialiseArduino();
}

public void initialiseArduino()
{
sPort = new SerialPort();
sPort.BaudRate = 9600;
sPort.PortName = "COM16";
sPort.Open();

//sPort.DataReceived += new SerialDataReceivedEventHandler(sPort_DataReceived);
}

void sPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string data = sp.ReadExisting();
displayMessage(data);
}

public void displayMessage(string data)
{
if (InvokeRequired)
{
this.Invoke(new Action<string>(displayMessage), new object[] { data });
return;
}
textBox1.Text = data;
}

private void button1_Click(object sender, EventArgs e)
{
while (true)
{
string data = sPort.ReadLine();
textBox1.Text = data;
}
}
}
}

当我使用串行数据接收事件处理程序时,即使在调用之后它也会给我这个问题。

所以我尝试通过单击一个按钮来运行相同的线程操作,它运行得非常好。

谁能告诉我我做错了什么?

最佳答案

问题的明显区别和原因是执行此操作的两种不同方式。您在 DataReceived 事件处理程序中使用 ReadExisting(),但在 Click 事件处理程序中使用 ReadLine()

ReadExisting() 只是没有按照您希望的那样进行,您只会得到 1 或 2 个字符。无论什么是“现有的”,都不会太多,因为 DataReceived 事件会快速触发并且现代台式计算机非常快。然后事件再次触发,您又读取了 1 或 2 个字符。您的文本框只显示最后出现的内容。

改为使用 ReadLine()。

关于c# - 显示从串口接收到的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31552626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com