使用线程在C#中实时显示arduino analogRead()

使用线程在C#中实时显示arduino analogRead(),c#,arduino,C#,Arduino,我正在制作一个C#程序,让它像一个糟糕的示波器一样工作。我有一个Arduino,它发送到serial(serial.write(analogRead(A0)),然后C#有一个线程,它在主线程刷新图表时读取每个ms的一个样本。我的疑问是,我应该使用Serial.write还是Serial.print 有可能达到2公里/秒吗?我使用的波特率是115200,这是代码 namespace TEST { public partial class Form1 : Form {

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

有可能达到2公里/秒吗?我使用的波特率是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;

        }

    }
名称空间测试
{
公共部分类Form1:Form
{
静态int缓冲区大小=1024;
公共静态字符串ComboxText;
公共静态int[]buffer=新int[buffer_size];
可数水母;
static int[]range=Enumerable.range(0,缓冲区大小).ToArray();
IEnumerable扩展数据=范围;
公共静态布尔标志=真;
公共表格1()
{
Random rand=新的Random();
初始化组件();

对于(int c=0;c在波特率为115200且处理器速度良好的情况下,您的算法似乎足够快。但可以降低速度的一个因素是计时器1的间隔。它应设置为尽可能低的间隔。此外,还应考虑串行.写入和串行.打印签出之间的差异。还应使用.net内置串行端口事件指针ler将为您节省大量压力,也是一种更快、更高效的解决方案。如果您尝试了串行端口事件,您可能会想检查一下它。

我尝试了,但我认为它工作不太好……事件处理程序无法每秒处理2k个样本。我应该使用缓冲区吗?@NikolasL。一个样本的数据包大小是多少?不是1024?不,实际上我用的是pic,然后一个接一个地发送每个样本。我用定时器控制样本,一旦ADC转换完成,我就通过UART发送。问题是当我接收到它们时。我用的是hc-06发送,我猜它也会一个接一个地发送,但操作系统无法处理接收2.5k次/se的事件c、 因此,我认为我应该通过读取整个缓冲区(2048字节)来处理这个事件,然后再进行处理。我说的对吗?首先,硬件不可能进行ADC处理并发送数据太快,以至于计算机太慢而无法读取数据。计算机通常比硬件快,因为硬件使用crysta当您的计算机与GHz频率的处理器一起工作时,一个耦合MHz的振荡器。因此,假设您的设备发送数据的速度足够快,那么您的计算机应该能够足够快地读取数据。您说您的计算机和硬件以115200的波特率通信。假设使用8-N-1格式发送样本。应使用10位发送一个样本,这意味着1秒内可发送的样本数为115200/10,即1秒内11520个样本。接收端也是如此。因此,如果使用事件,则不应有任何问题。