0

私がまとめているプロジェクトの一環として、C♯ を介して MySQL データベースを更新する Arduino があり、別の場所に別の C♯ プログラムがあり、データベースに対して単純な SELECT クエリを実行し、その結果を別の Arduino に通信します。シリアル。私はこの 2 番目のプログラムのほとんどのコードを書きましたが、最後に厄介な問題がいくつかあります。

以下はコードです:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;
using System.Xml;
using System.IO.Ports;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            string hkday;
            string hkall;
            //SERIAL
            SerialPort serialPort1 = new SerialPort();
            serialPort1.PortName = "COM4";
            serialPort1.BaudRate = 9600;
            serialPort1.NewLine = "\n";

            //OPEN SERIAL
            serialPort1.Open();

            //SQL
            string connString = "Server=xxxx;Uid=xxxx;Password=xxxx;Port=xxxx;Database=xxxx;";
            MySqlConnection conn = new MySqlConnection(connString);
            MySqlCommand command1 = conn.CreateCommand();
            command1.CommandText = "Select USERS from HK where UPTIME='HKDAY'";
            MySqlCommand command2 = conn.CreateCommand();
            command2.CommandText = "Select USERS from HK where UPTIME='HKALL'";

            //EXECUTE QUERIES
            if (_continue = true)
            {
                conn.Open(); //Connect
                MySqlDataReader reader1 = command1.ExecuteReader();
                while (reader1.Read())
                {
                    //Write to value and string   
                    Console.WriteLine(reader1["USERS"].ToString());
                    hkday = reader1["USERS"].ToString();
                }

                Console.ReadLine();
                _continue = false;
                conn.Close(); //Disconnect
            }
            else
            {
                conn.Open(); //Connect
                MySqlDataReader reader2 = command1.ExecuteReader();
                while (reader2.Read())
                {
                    //Write to console and string    
                    Console.WriteLine(reader2["USERS"].ToString());
                }
                hkall = reader2["USERS"].ToString();

                Console.ReadLine();
                _continue = true;
                conn.Close(); //Disconnect

                //WRITE STRINGS TO SERIAL
                serialPort1.WriteLine(
                    String.Format(hkday, hkall));
            }

            serialPort1.Close();

        }

        public static bool _continue { get; set; }
    }
}
  1. 「hkday」と「hkall」の両方を参照できるようにするために、WRITE STRINGS TO SERIAL というタイトルのセクションを構文化し、コード内に配置する方法がわかりません。

  2. 「if (_continue = true)」フラグが機能していないようで、その理由がわかりません。

  3. これら 2 つの問題が解決されれば、プログラムは機能するはずですが、他に明らかな問題はありますか?

ありがとう、私はこれらがほんの小さな問題であることを知っていますが、解決できないようです.

潜在的に重要: arduino プログラムは既にこれを入力として認識しているため、出力を '123,456\n' として取得しようとしています。


アップデート

私が持っている答えを受け取ったので、このプロジェクトを現在行っている他のプロジェクトと組み合わせて、arduinoにC#を介してMySQLデータベースを更新させ、更新されていないテーブルのデータをダウンロードして表示させました別のarduinoを介して出ます。

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;
using MySql.Data.MySqlClient;

namespace SQL_Scraper
{

    public partial class Sandro : Form
    {
        //Serial Settings
        SerialPort UNO = new SerialPort("COM4", 9600);
        SerialPort MEGA = new SerialPort("COM3", 9600);

        //Incoming Data String
        string RxString;

        //Int for download
        int? vnday = 0;
        int? vnall = 0;

        public Sandro()
        {
            InitializeComponent();

            //Open UNO port
            UNO.Open();

            //Open MEGA Port
            MEGA.Open();
        }

        private void MEGA_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {

        }

        private void Sandro_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (UNO.IsOpen | MEGA.IsOpen)
            {
                UNO.Close();
                MEGA.Close();
            }
        }

        private void DisplayText(object sender, EventArgs e)
        {

        }

        private void Begin_Click(object sender, EventArgs e)
        {
            //Turn off start button
            Begin.Enabled = false;
            //?
            this.Invoke(new EventHandler(DisplayText));
            //Create Event Handler if data is receiverd
            MEGA.DataReceived += new SerialDataReceivedEventHandler(MEGA_DataReceived);

            string SQLString = "Server=benchmarkcount.db.9506323.hostedresource.com;Uid=benchmarkcount;Password=Watercress2428;Port=3306;Database=benchmarkcount;";
            MySqlConnection SQLConnection = new MySqlConnection(SQLString);

            //Receive data
            RxString = MEGA.ReadExisting();

            //Append Serial Input to Output box)
            outputBox.AppendText(RxString);

            //Get Unsaved input from text box
            string input = outputBox.Text;
            string[] inputLines = input.Split('\n');

            //Upload findings from MEGA to SQL
            foreach (string line in inputLines)
            {
                if (line.EndsWith("\r")) //Makes sure line is complete
                {
                    if (line.StartsWith("Today's total users: "))
                    {
                        string dayUsers = line.Substring(20).Trim();
                        MySqlCommand UpdateHKDAY = SQLConnection.CreateCommand();
                        UpdateHKDAY.Parameters.AddWithValue("param1", dayUsers);
                        UpdateHKDAY.CommandText = "UPDATE HK SET USERS=?param1 WHERE UPTIME='HKDAY'";
                        SQLConnection.Open();
                        UpdateHKDAY.ExecuteNonQuery();
                        SQLConnection.Close();
                    }
                    else if (line.StartsWith("All-time total users: "))
                    {
                        string allUsers = line.Substring(21).Trim();
                        MySqlCommand UpdateHKALL = SQLConnection.CreateCommand();
                        UpdateHKALL.Parameters.AddWithValue("param2", allUsers);
                        UpdateHKALL.CommandText = "UPDATE HK SET USERS=?param2 WHERE UPTIME='HKALL'";
                        SQLConnection.Open();
                        UpdateHKALL.ExecuteNonQuery();
                        SQLConnection.Close();
                    }
                }
            }

            //Only keep unparsed text in text box
            outputBox.Text = inputLines[inputLines.Length - 1];

            //Download Numbers Query
            MySqlCommand DownUsers = new MySqlCommand("Select USERS, UPTIME from VN where UPTIME IN ('VNDAY', 'VNALL')", SQLConnection);

            //Open Connection
            SQLConnection.Open();

            //Execute Downloading Numbers
            MySqlDataReader theResults = DownUsers.ExecuteReader();
            while (theResults.Read())
            {
                switch (theResults["UPTIME"] as string)
                {
                    case "VNDAY":
                        vnday = theResults["USERS"] as int?;
                        break;
                    case "VNALL":
                        vnall = theResults["USERS"] as int?;
                        break;
                }
            }

            //Do things with the results
            UNO.WriteLine(String.Format("{0},{1}", vnday, vnall));
            Console.WriteLine(String.Format("{0},{1}", vnday, vnall));

            //Close Connection
            SQLConnection.Close();
        }

        private void Sandro_Load(object sender, EventArgs e)
        {

        }

        private void Cease_Click(object sender, EventArgs e)
        {
            Begin.Enabled = true;
            Cease.Enabled = false;
        }
    }
}

ただし、このデータ (arduino に送信されるデータ) を入力ボックスでチェックして、「vnday, vnall\n」の形式であることを確認できるようにしたいと考えています。

4

2 に答える 2

1

あなたの質問と例には矛盾が多すぎます。個別のアプリの実行間に静的な永続性があるという印象を受けているようです。ありません。すべての静的変数は、実行ごとにクリアされます。同じアプリ ドメイン内のループで呼び出したメソッドがある場合は異なります。

また、変数名と出力要件から判断すると、USERS フィールドは数値です。

したがって、次の表があると仮定します。

USERS    UPTIME
------   ------
123456   HKALL
234567   HKDAY

次のコード:

public static void Main()
{
    int? hkday = 0;
    int? hkall = 0;

    using (MySqlConnection conn = new MySqlConnection("..."))
    {
        conn.Open();

        MySqlCommand cmd = new MySqlCommand("Select USERS, UPTIME from HK where UPTIME IN ('HKDAY', 'HKALL')", conn);

        MySqlDataReader reader = cmd.ExecuteReader();

        //this assumes that there is only one record per 'HKDAY' and 'HKALL',
        //otherwise the last value will be stored
        while (reader.Read())
        {
            switch (reader["UPTIME"] as string)
            {
                case "HKDAY":
                    hkday = reader["USERS"] as int?;
                    break;
                case "HKALL":
                    hkall = reader["USERS"] as int?;
                    break;
            }
        }
    }

    Console.WriteLine(String.Format("{0:N0}\n{1:N0}\n", hkday, hkall));
}

出力します:

234,567
123,456

または、独立したクエリを実行したい場合:

private static int? GetUSERS(string hkval)
{
    using (MySqlConnection conn = new MySqlConnection("..."))
    {
        conn.Open();

        MySqlCommand cmd = new MySqlCommand("Select USERS from HK where UPTIME=@hkval", conn);
        cmd.Parameters.AddWithValue("hkval", hkval);

        MySqlDataReader reader = cmd.ExecuteReader();

        if (reader.Read())
            return reader["USERS"] as int?;

        return null;
    }
}

public static void Main()
{
    int hkday = (int)GetUSERS("HKDAY");
    int hkall = (int)GetUSERS("HKALL");

    Console.WriteLine(String.Format("{0:N0}\n{1:N0}\n", hkday, hkall));
}

args を使用して、HKDAY/HKALL をパラメーターとしてアプリに渡すこともできます。

于 2012-07-23T20:33:26.133 に答える
0

私は C プログラマーではありませんが、多くのシリアル ポートを知っています。これで最初の問題が解決されると思います。

//WRITE STRINGS TO SERIAL
      serialPort1.Write(hkday);             // do not append line feed
      serialPort1.WriteLine(hkall);         // append line feed
于 2012-07-20T17:32:50.063 に答える