从A / D设备轻松进行串行读取

当东河1

新成员
已加入
2018年5月24日
留言内容
1
编程经验
Beginner
嗨,大家好,我在这个论坛上的第一篇文章,将会很长 :p 懒散的:.

我只是重新开始编程。我的经验有限-多年来:Quickbasic,Visual Basic 6并涉足PIC编程以及HTML / CSS。我已经写了一些有用且可行的解决方案,因此我对算法和编程有了一定的了解,但是C#不断突破极限。我想学习"C"类型结构,因为与Java和"处理与Arduino"我目前正在参与其中。

设置场景(如果我还没有的话) :醉:),这就是我目前所在的位置。我已经在写软件了"Processing 2.2.1"并且它可以按要求工作,但是我希望在GUI方面有更多帮助,因此可以学习C#。

它基本上是一个福彩12选5走势图记录器。 Arduino板(A / D转换器)以每秒100个样本的速度可靠地将10位(0-1023)福彩12选5走势图输出到串行总线。读取福彩12选5走势图并将其保存到文件中以进行进一步评估(x / y图和一些基本数学运算)。 A / D转换器连接到称重传感器,该软件将记录和评估自制模型火箭发动机(糖火箭和黑火药火箭)的推力性能。

这是一个个人爱好项目,该软件将发布在与之相关的一些烟火和火箭模型论坛上。

最后,这是我从网上获得的C#代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace SimpleSerial
{
    public partial class Form1 : Form
    {
        // Add this variable 
        string RxString;

        public Form1()
        {
            InitializeComponent();
        }

        private void buttonStart_Click(object sender, EventArgs e)
        {
            serialPort1.PortName = "COM8";
            serialPort1.BaudRate = 57600;

            serialPort1.Open();
            if (serialPort1.IsOpen)
            {
                buttonStart.Enabled = false;
                buttonStop.Enabled = true;
                textBox1.ReadOnly = false;
            }
        }

        private void buttonStop_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
                buttonStart.Enabled = true;
                buttonStop.Enabled = false;
                textBox1.ReadOnly = true;
            }

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serialPort1.IsOpen) serialPort1.Close();
        }

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            // If the port is closed, don't try to send a character.
            if (!serialPort1.IsOpen) return;

            // If the port is Open, declare a char[] array with one element.
            char[] buff = new char[1];

            // Load element 0 with the key character.
            buff[0] = e.KeyChar;

            // Send the one character buffer.
            serialPort1.Write(buff, 0, 1);

            // Set the KeyPress event as handled so the character won't
            // display locally. If you want it to display, omit the next line.
               e.Handled = true;
        }

        private void DisplayText(object sender, EventArgs e)
        {
            textBox1.AppendText(RxString);
        }

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            RxString = serialPort1.ReadExisting();
            this.Invoke(new EventHandler(DisplayText));
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }
    }
}

该代码可以正常工作,因为它会将福彩12选5走势图记录到文本框中。我能够通过复制/粘贴到notepad ++中来进行检查,它的确以100个样本秒的速率记录下来。问题是"hangs"有时候这是一个很大的不。在花了许多小时制造可能仅燃烧2-10秒的火箭发动机而没有记录福彩12选5走势图的火箭发动机后,并不是一个好的结果。

我不完全了解代码-我确实了解一些部分,但不知道在哪里看。一件事是,它只挂在(buttonStop)事件上。

我不需要那么复杂。使用我的软件,不需要后台线程或异步操作。我想要的是,当记录福彩12选5走势图时,什么也没发生! -不需要!我不要!除了将福彩12选5走势图写入文件的停止按钮。这不是"live"示波器或心脏监护仪等

将来能够将福彩12选5走势图发送到串行端口进行基本"handshaking"操作,但在此阶段并不重要。

我不想成为C#串行操作专家-我想开发GUI,文件IO ops,绘制图形等,我想我会对它们有所了解,否则,我将在这里提出问题在这个论坛上。另外,我也不希望被人喂饱,但是到了这一点,我的软件这一部分将整个工作拖到了一起,我也随之而来。

同样重要的是要指出,我在过去2-3周内做了很多研究。正确方向的一些指针将是绝对值得赞赏的。

干杯。
 
由主持人最后编辑:

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
您确实需要后台线程。 SerialPort有充分的理由在辅助线程上引发其DataReceived事件。这意味着可以立即处理事件,而不必等待UI线程上可能发生的任何其他操作。这也意味着在处理SerialPort事件时,您的UI将保持响应状态。

对于您的问题,首先要做的是弄清楚问题所在。应用程序挂起要么是无限循环,要么是不返回的方法。在您的情况下,似乎'buttonStop_Click'方法中的IsOpen或Close是唯一可能的候选者,因此您应先确定返回的是哪个。
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,051
地点
挪威
编程经验
10+
正如jmcilhinney指出的那样,通过立即调用UI线程来否定DataReceived的目的,这可能会使其他UI交互停顿下来。我将在DataReceived中将RxString添加到类级别的StringBuilder并将该事件保留在那里。然后,使用计时器在文本框中显示StringBuilder中的文本,例如每秒显示一次。
 
最佳 底部