0

こんにちは、Arduino からシリアル入力を読み込もうとしていますが、うまくいきません。接続を正しく開いたり閉じたりしていると思いますが、あまり成功していないようです!

シリアルターミナルで見ることができるので、Arduinoがデータを出力していると確信しています。

私の C# プログラムのコードは以下のとおりです。

また、これは「12.2,1111,332,233」を受け取る必要があるシリアルデータの例です

namespace FridgeProtectionDeviceMonitor
{
    public partial class Online_mode : Form
    {

        public Online_mode()
        {
            InitializeComponent();
        }

        private void Online_mode_Load(object sender, EventArgs e)
        {
            cmbPortSelection.DataSource = SerialPort.GetPortNames();
            cmbChartSelection.SelectedIndex = 0;
        }

        string x = "";
        SerialPort port;

        private void btnFindPorts_Click(object sender, EventArgs e)
        {
            var ports = SerialPort.GetPortNames();
            cmbPortSelection.DataSource = ports;
        }

        private void btnOpenPort_Click(object sender, EventArgs e)
        {
            if (cmbPortSelection.SelectedIndex > -1)
            {
                port = new SerialPort(cmbPortSelection.Text);
                try
                {
                    if (!port.IsOpen)
                    {
                        port.BaudRate = 9600;
                        port.Open();
                    }
                }
                catch (Exception)
                {
                    MessageBox.Show("Serial connection request denied: Port is in use!");
                }
            }
            else
            {
                MessageBox.Show("Serial connection request denied: No port selected!");
            }
        }

        private void btnClosePort_Click(object sender, EventArgs ex)
        {

            try
            {
                port.Close();

            }
            catch (Exception)
            {
                MessageBox.Show("Serial close connection request denied: ", ex.ToString());
            }
        }

        private void update(object sender, EventArgs e)
        {
            txtSaveLocation.Text = x;
        }

        private void port_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            x = port.ReadLine().ToString();
            MessageBox.Show(x);
            this.Invoke(new EventHandler(update));

        }
    }
}
4

3 に答える 3

0

私はあなたと同じことをやっていたのです。あなたがそれをあなたの目的のために使いたいのならあなたはそれを修正しなければならないでしょう、しかしこれが私が使うコードです。唯一の問題は、スピードメーター用であり、一種の遅れがあるため(理由は誰でも知っていますか?)、非常にすばやく読み取る必要があるということですが、とにかくここに私のコードがあります。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                if (arduinoCom.IsOpen == false)
                {
                    arduinoCom.Open();
                }
            }

            catch
            {
                MessageBox.Show("Serial Error: Is your serial plugged in?");
            }

        }

        private void refresh_Tick(object sender, EventArgs e)
        {            
            string speedReading = arduinoCom.ReadLine();
            speed.Text = speedReading;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            arduinoCom.Close();
        }

    }
}
于 2013-03-06T03:40:36.507 に答える
0

PICマイクロコントローラーにリンクされたXBeeワイヤレスブリッジにリンクされたUSBからシリアルへのコンバーターを持っています。シリアルポートの読み取り機能を別のスレッドで実行すると、通信速度が慢性的に向上することがわかりました!

readline は、改行文字が受信されるまでコードをブロックするため、メイン スレッドがブロックされます。別のスレッドに移動する前に、GUI が応答しなくなりました。ちなみに、ReadByte() を使用しています。

バックグラウンドワーカーでシリアルバッファからバイトを継続的に読み取り、それらをスレッドセーフキューに格納しています。次に、通信開始ビットのキューをチェックし、そこからパケットを分析します。手動リセット イベントを使用して、すべてを同期しています。

私の経験では、port_datareceived イベントは serialport クラスへの素晴らしい追加ですが、残念ながら高速通信にはあまり役に立ちません。私は12900ボーで走っています。

コード スニペットが必要な場合は、提供できます。

よろしく、ピート

PS マルチチャンネル ソフトウェアを備えた ATS5004D 4 チャンネル差動オシロスコープを使用しています。マルチチャネル ソフトウェアは、内蔵のシリアル アナライザ ブロックを介して、電圧信号をシリアル データに解析できます。そうすれば、シリアル通信回線で実際に議論されていることを確認できます!! BSの他のシリアル端子をすべて切り取って追加...

于 2013-09-10T23:19:15.827 に答える