質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

C#でシリアル通信を行いその値をint型に変換する方法

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,156

yakoumori

score 6

こんばんは。

現在ArduinoとC#を連携させて画面の明るさを変更するためのプログラムの作成を行っています。
Ardiunoから圧力センサの値を受信して、C#にて画面の明るさを変更しようとしています。

C#の開発環境はVisualStudio2013でシリアル通信をさせることはできたのですが、
シリアル通信によって得た圧力センサの値を画面の明るさへの値として入れようとしてもうまくいきません。

今の状態はArduinoからfloat型にしている圧力センサの平均値を読み取り、listBoxに表示するところまでできています。
イメージ説明

画面の明るさを変更するにはint型を要求されていることはわかったのですが、
肝心の変換のやり方がわからなくて困っています。

1度Convertを利用して、

private void AddLog(String text)
        {
      int t = Convert.ToInt32(text);
            listBox1.Items.Insert(0, text);
        }

と入力してみたのですが実行途中にて次のようなエラーが起きました。起きました
どのように変換すればint型になり明るさを変更できるのかがわかりません。

ソースコード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace display
{
    public partial class Form1 : Form
    {


        #region Constants
        /// <summary>
        /// Settings in this subgroup control configuration of the video power management features.
        /// </summary>
        Guid GUID_VIDEO_SUBGROUP = new Guid("7516b95f-f776-4464-8c53-06167f40cc99");

        /// <summary>
        /// Guid for display brightness setting.
        /// </summary>
        Guid DisplayBrightnessGuid = new Guid("aded5e82-b909-4619-9949-f5d71dac0bcb");
        #endregion

        #region Methods
        /// <summary>
        /// Retrieves the AC index of the specified power setting.
        /// </summary>
        /// <param name="RootPowerKey">This parameter is reserved for future use and must be set to NULL.</param>
        /// <param name="SchemeGuid">The identifier of the power scheme.</param>
        /// <param name="SubGroupOfPowerSettingsGuid">The subgroup of power settings. This parameter can be one of the following values defined in WinNT.h. Use NO_SUBGROUP_GUID to refer to the default power scheme.</param>
        /// <param name="PowerSettingGuid">The identifier of the power setting</param>
        /// <param name="AcValueIndex">A pointer to a variable that receives the AC value index.</param>
        /// <returns>Returns ERROR_SUCCESS (zero) if the call was successful, and a nonzero value if the call failed.</returns>
        [DllImport("powrprof.dll", EntryPoint = "PowerReadACValueIndex", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern uint PowerReadACValueIndex(IntPtr RootPowerKey, ref Guid SchemeGuid, ref Guid SubGroupOfPowerSettingsGuid, ref Guid PowerSettingGuid, out uint AcValueIndex);


        /// <summary>
        /// Sets the AC value index of the specified power setting.
        /// </summary>
        /// <param name="RootPowerKey">This parameter is reserved for future use and must be set to NULL.</param>
        /// <param name="SchemeGuid">The identifier of the power scheme.</param>
        /// <param name="SubGroupOfPowerSettingsGuid">The subgroup of power settings. This parameter can be one of the following values defined in WinNT.h. Use NO_SUBGROUP_GUID to refer to the default power scheme.</param>
        /// <param name="PowerSettingGuid">The identifier of the power setting</param>
        /// <param name="AcValueIndex">The AC value index.</param>
        /// <returns>Returns ERROR_SUCCESS (zero) if the call was successful, and a nonzero value if the call failed.</returns>
        [DllImport("powrprof.dll", EntryPoint = "PowerWriteACValueIndex", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern uint PowerWriteACValueIndex(IntPtr RootPowerKey, ref Guid SchemeGuid, ref Guid SubGroupOfPowerSettingsGuid, ref Guid PowerSettingGuid, uint AcValueIndex);

        /// <summary>
        /// Retrieves the AC index of the specified power setting.
        /// </summary>
        /// <param name="RootPowerKey">This parameter is reserved for future use and must be set to NULL.</param>
        /// <param name="SchemeGuid">The identifier of the power scheme.</param>
        /// <param name="SubGroupOfPowerSettingsGuid">The subgroup of power settings. This parameter can be one of the following values defined in WinNT.h. Use NO_SUBGROUP_GUID to refer to the default power scheme.</param>
        /// <param name="PowerSettingGuid">The identifier of the power setting</param>
        /// <param name="AcValueIndex">A pointer to a variable that receives the AC value index.</param>
        /// <returns>Returns ERROR_SUCCESS (zero) if the call was successful, and a nonzero value if the call failed.</returns>
        [DllImport("powrprof.dll", EntryPoint = "PowerReadDCValueIndex", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern uint PowerReadDCValueIndex(IntPtr RootPowerKey, ref Guid SchemeGuid, ref Guid SubGroupOfPowerSettingsGuid, ref Guid PowerSettingGuid, out uint AcValueIndex);


        /// <summary>
        /// Sets the AC value index of the specified power setting.
        /// </summary>
        /// <param name="RootPowerKey">This parameter is reserved for future use and must be set to NULL.</param>
        /// <param name="SchemeGuid">The identifier of the power scheme.</param>
        /// <param name="SubGroupOfPowerSettingsGuid">The subgroup of power settings. This parameter can be one of the following values defined in WinNT.h. Use NO_SUBGROUP_GUID to refer to the default power scheme.</param>
        /// <param name="PowerSettingGuid">The identifier of the power setting</param>
        /// <param name="AcValueIndex">The AC value index.</param>
        /// <returns>Returns ERROR_SUCCESS (zero) if the call was successful, and a nonzero value if the call failed.</returns>
        [DllImport("powrprof.dll", EntryPoint = "PowerWriteDCValueIndex", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern uint PowerWriteDCValueIndex(IntPtr RootPowerKey, ref Guid SchemeGuid, ref Guid SubGroupOfPowerSettingsGuid, ref Guid PowerSettingGuid, uint AcValueIndex);


        /// <summary>
        /// Sets the active power scheme for the current user.
        /// </summary>
        /// <param name="UserRootPowerKey">This parameter is reserved for future use and must be set to NULL.</param>
        /// <param name="SchemeGuid">The identifier of the power scheme.</param>
        /// <returns>Returns ERROR_SUCCESS (zero) if the call was successful, and a nonzero value if the call failed.</returns>
        [DllImport("powrprof.dll", EntryPoint = "PowerSetActiveScheme", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern uint PowerSetActiveScheme(IntPtr UserRootPowerKey, ref Guid SchemeGuid);

        #endregion

        public Form1()
        {
            InitializeComponent();
        }


        private delegate void AddLogDelegate(String text);
        string str;
        Guid MY_POWER_MANAGEMENT_POLICY = new Guid("a83ffe77-647e-45df-899e-cd3f4e2835a1"); // 今回は<SCHEME_GUID>をベタ指定


        //コマンドプロンプトでの実行をここで行う
        bool SetACBrightness(int bright_ac)
        {
             if (bright_ac < 0 || bright_ac > 100)
                return false;

            uint ret = PowerWriteACValueIndex(IntPtr.Zero, ref MY_POWER_MANAGEMENT_POLICY, ref GUID_VIDEO_SUBGROUP, ref DisplayBrightnessGuid, (uint)bright_ac);
            if (ret != 0)
                return false;

            ret = PowerSetActiveScheme(IntPtr.Zero, ref MY_POWER_MANAGEMENT_POLICY);
            if (ret != 0)
                return false;

            return true;
        }

        private void serialPort1_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
        {
            str = serialPort1.ReadLine();
            AddLogDelegate dlg1 = new AddLogDelegate(AddLog);
            BeginInvoke(dlg1, new object[] { str });
        }
        private void AddLog(String text)
        {
            int t = Convert.ToInt32(text);
            listBox1.Items.Insert(0, text);
        }



        //ボタンによる実行
        private void button1_Click_1(object sender, EventArgs e)
        {

            //Ardinoの設定
            try
            {
                this.serialPort1.PortName = "COM3";
                this.serialPort1.BaudRate = 9600;
                this.serialPort1.Parity = System.IO.Ports.Parity.None;
                this.serialPort1.DataBits = 8;
                this.serialPort1.StopBits = System.IO.Ports.StopBits.One;
                serialPort1.Open();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            /*
            Random rb_ac = new System.Random();
            //画面の明るさ変更を乱数で1~100の値を設定
            int b_ac = rb_ac.Next(100);
            //labelにランダムの値を表示
            label1.Text = b_ac.ToString();
             */


            //徐々にスクリーンの明るさの変更を行うソースコード
            int c_ac = 1;
            for (int i = 100; i >1; i--)
            {
                c_ac = i;

                //boolの実行
                if (SetACBrightness(c_ac) == true)
                {
                }
            }
            for (int i = 0; i <= 100; i++)
            {
                c_ac = i;
                //boolの実行
                if (SetACBrightness(c_ac) == true)
                {
                }
            }

        }





        private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
        }

    }
}

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • gesyutapo

    2018/12/19 01:14

    恐らくシリアル通信で送られくる文字列が数字だけのものではない、あるいは16進数の値(0〜F)ではないでしょうか?
    シリアル通信で送られてきている文字列をそのままデバッグ表示したらどのような文字列が表示されるか追記願えますか?

    キャンセル

回答 3

checkベストアンサー

+1

追記ありがとうございました。
テキストは浮動小数点数という事で、少なくとも以下のようにすれば整数値で値が得られると思います。

private void AddLog(String text)
{
    double value = double.Parse(text);
    int t = (int)value;
    listBox1.Items.Insert(0, text);
}

さらに言えば、小数点数の扱いですが、

private void AddLog(String text)
{
    double value = double.Parse(text);
    double value_ceiling = Math.Ceiling(value);    // 切り上げ
    double value_floor = Math.Floor(value);        // 切り捨て
    double value_round = Math.Round(value, MidpointRounding.AwayFromZero);  // 四捨五入
    int t = (int)value;
    listBox1.Items.Insert(0, text);
}

といった形で処理することが出来るので、目的に合わせて切り上げたり、切り捨てたり、四捨五入してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/19 11:16

    Arduinoではfloatによって求められた平均値をSerial.printlnで送信しているだけなのですが、送信で半角が全角になることがあるのですか?
    圧力センサの値の読み込みはint型、平均値はfloatで読み込んでいます。

    キャンセル

  • 2018/12/19 11:46

    例外発生時にdouble.Parse()に何が渡されているか確認してください。

    キャンセル

  • 2018/12/19 12:02

    解決しました。自分で設定したものがあったのでそれを利用しました。

    キャンセル

+1

小数点付きの文字列であれば、
「C# 文字列 float 変換」でぐぐれば変換方法は出てきます
小数点以下2桁、と決まってるなら、floatにしたあと100掛けて、intにしてしまい、あとの換算に使えばいいでしょう
(最終的に100で割るのを忘れずに)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

ソースコードにstring str;を設定し、 

 private void serialPort1_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
        {
           str = serialPort1.ReadLine();
           AddLogDelegate dlg1 = new AddLogDelegate(AddLog);
           BeginInvoke(dlg1, new object[] { str });
        }


の中でstrにシリアルポートの値を読み込んでいた場所がありました。
その文字列をParseにて変換することでSetACBrightness(t);にて読み込むことができました。

 private void AddLog(String text)
        {
            double val = double.Parse(str);
            t = (int)val;
            SetACBrightness(t);
        }

回答やコメントをしてくれた方々ありがとうございます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる