【问题标题】:Display arduino analogRead() in real time in C# using thread使用线程在 C# 中实时显示 arduino analogRead()
【发布时间】:2016-06-12 22:27:29
【问题描述】:

我正在制作一个 C# 程序,让它像一台糟糕的示波器一样工作。我有一个 Arduino 发送到串行 (Serial.write(analogRead(A0)) ),然后 C# 有一个线程在主线程刷新图表时读取每个 ms 的样本。我的疑问是,我应该使用 Serial.write 还是 Serial.print ?

有可能达到 2kS/s 吗?我使用的是 115200 的波特率,代码如下。

namespace TEST
{
    public partial class Form1 : Form
    {

        static int buffer_size = 1024;

        public static string comboBoxText;
        public static int[] buffer = new int[buffer_size];
        IEnumerable<int> yData;
        static int[] range = Enumerable.Range(0, buffer_size).ToArray();
        IEnumerable<int> xData = range;
        public static bool flag = true;


        public Form1()
        {


            Random rand = new Random();
            InitializeComponent();

            for (int c = 0; c<buffer_size;c++) {
                buffer[c] = 0;
            }



             Thread thread1 = new Thread(fillBuffer);
             thread1.Start();


            comboBox1.Items.Add("Select");
            foreach (string s in SerialPort.GetPortNames())
            {
                comboBox1.Items.Add(s);
            }


         }
        static public void fillBuffer()
        {
            Thread.Sleep(1000);
            SerialPort serialPort1 = new SerialPort();
            serialPort1.PortName = "COM5";
            serialPort1.BaudRate = 115200;
            serialPort1.Open();

            while (true)
            {


            }

        }


        private void timer1_Tick(object sender, EventArgs e)
        {
            yData = buffer;
            chart1.Series[0].Points.DataBindY(yData);

        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {


            try {

                comboBoxText = comboBox1.Text;
            }
            catch
            {
                MessageBox.Show("Porta Inválida");
                return;
            }
            comboBox1.Enabled = false;

        }

    }

我能做些什么来每 0.5 毫秒采样一次,然后将样本显示为点的集合?我没有得到好的结果。如果有人可以帮忙,谢谢!

【问题讨论】:

  • 你试过串口事件吗?

标签: c# arduino


【解决方案1】:

在 115200 的波特率和良好的处理器速度下,您的算法似乎足够快。但是可以减慢速度的事情之一是timer1的间隔。它应该设置为尽可能低的值。另外对于 Serial.Write 和 Serial.Print 之间的区别,请查看 this forum 。此外,使用 .net 内置串行端口事件处理程序可以为您减轻很多压力,并且也是一种更快、更有效的解决方案。你可能想看看here

【讨论】:

  • 我做到了,但我不认为它运作良好......事件处理程序每​​秒无法处理 2k 个样本。我应该使用缓冲区吗?
  • @NikolasL。 1 个样本的数据包大小是多少?不是 1024 吗?
  • 不,实际上我正在使用图片并逐个发送每个样本。我正在使用定时器来控制样本,一旦 ADC 转换完成,我就会通过 UART 发送它。问题是当我收到它们时。我正在使用 hc-06 发送,我猜它也一个一个地发送,但操作系统无法处理接收 2.5k 次/秒的事件,所以我认为我应该通过读取整个缓冲区来处理这个事件是2048字节然后我处理。我说的对吗?
  • 首先,您的硬件不可能进行一些 ADC 处理和发送数据的速度如此之快,以至于计算机读取速度太慢。计算机通常比您的硬件快,因为您的硬件使用几兆赫兹的晶体振荡器,而您的计算机使用的是 GHz 频率的处理器。因此,假设您的设备发送数据的速度足够快,那么您的计算机应该能够足够快地读取数据。您说您的计算机和您的硬件正在以 115200 的波特率通信。
  • 假设样本使用 8-N-1 格式发送。一个样本应该使用 10 位发送,这意味着 1 秒内可以发送的样本数是 115200/10,即一秒内 11520 个样本。接收端也是如此。所以如果你使用事件,你应该不会有任何问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 2016-04-03
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
相关资源
最近更新 更多