🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

2264閲覧

C#のシリアル通信での文字送信

brue__akio

総合スコア5

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2019/12/06 06:19

C#での文字のシリアル通信

今バブルメッセンジャーという名前で、入力した文字を一文字ずつ水槽内に泡として出力するものをVB.NETで書かれたプログラムをC#に翻訳して作り直しています。
プログラムはシリアル通信を通してリレー回路が組まれた基盤に送り、それでバルブの開け閉めで文字を作るようにしています。

発生している問題

文字の入力後、送信をする際に基盤の回路が動かずそのままになってしまいます

該当のソースコード

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace bubble_2019 12{ 13 public partial class Form1 : Form 14 { 15 private byte[] outdata = new byte[10]; 16 17 public Form1() 18 { 19 InitializeComponent(); 20 } 21 22 private void Form1_Load(object sender, EventArgs e) 23 { 24 serialPort1.PortName = "COM0"; 25 serialPort1.BaudRate = 9600; 26 serialPort1.Parity = System.IO.Ports.Parity.None; 27 serialPort1.DataBits = 8; 28 serialPort1.Handshake = System.IO.Ports.Handshake.None; 29 serialPort1.RtsEnable = false; 30 cmdSEND.Enabled = false; 31 sendroop.Enabled = false; 32 textBox1.Text = "文字を入れてください"; 33 timer1.Enabled = false; 34 } 35 36 private void cmdOPEN_Click(object sender, EventArgs e) 37 { 38 label2.Text = "エラーはありません"; 39 if (serialPort1.IsOpen == true) 40 { 41 serialPort1.Close(); 42 cmdOPEN.Text = "通信開始"; 43 comboBox1.Enabled = true; 44 cmdSEND.Enabled = false; 45 sendroop.Enabled = false; 46 } 47 else 48 { 49 try 50 { 51 serialPort1.PortName = comboBox1.SelectedItem.ToString(); 52 serialPort1.Open(); 53 } 54 catch 55 { 56 label2.Text = "COMポートが間違っています"; 57 return; 58 } 59 cmdOPEN.Text = "通信停止"; 60 comboBox1.Enabled = false; 61 cmdSEND.Enabled = true; 62 sendroop.Enabled = true; 63 } 64 } 65 private void SENDdeta() 66 { 67 string moji; 68 int a, b, c, n, mojisu, mojisu2; 69 int data1, data2, data3, data4, data5, data6; 70 long color; 71 Bitmap bitm = new Bitmap(pictureBox1.Image); 72 Color co; 73 mojisu = textBox1.Text.Length; 74 mojisu2 = mojisu; 75 serialPort1.DiscardInBuffer(); 76 moji = textBox1.Text; 77 mojisu = moji.Length; 78 79 for (n = 1; n <= mojisu; n++) //バッファ? 80 { 81 outdata[0] = 0x53; 82 outdata[1] = 0x30; 83 outdata[2] = 0x30; 84 outdata[3] = 0x30; 85 outdata[4] = 0x30; 86 outdata[5] = 0x30; 87 outdata[6] = 0x30; 88 outdata[7] = 0x30; 89 outdata[8] = 0x30; 90 outdata[9] = 0xD; 91 92 do 93 { 94 if (serialPort1.IsOpen == true) 95 { 96 serialPort1.Write(outdata, 0, outdata.Length); 97 string readData = serialPort1.ReadExisting(); 98 } 99 } 100 while (serialPort1.IsOpen == true); 101 for (var Y = 0; Y <= 23; Y++) 102 { 103 a = 0; 104 for (var X = 0; X <= 7; X++) 105 { 106 co = bitm.GetPixel((n - 1) * 24 + X, Y); 107 color = co.A; 108 a = a * 2; 109 if (color != 0) 110 a = a + 1; 111 } 112 b = 0; 113 for (var X = 8; X <= 15; X++) 114 { 115 co = bitm.GetPixel((n - 1) * 24 + X, Y); 116 color = co.A; 117 b = b * 2; 118 if (color != 0) 119 b = b + 1; 120 } 121 c = 0; 122 for (var X = 16; X <= 23; X++) 123 { 124 co = bitm.GetPixel((n - 1) * 24 + X, Y); 125 color = co.A; 126 c = c * 2; 127 if (color != 0) 128 c = c + 1; 129 } 130 131 data1 = (a / 16) % 16; 132 data2 = a % 16 + 0x30; 133 data3 = (b / 16) % 16 + 0x30; 134 data4 = b % 16 + 0x30; 135 data5 = (c / 16) % 16 + 0x30; 136 data6 = c % 16 + 0x30; 137 138 outdata[0] = 0x53; 139 outdata[1] = (byte)data5; 140 outdata[2] = (byte)data6; 141 outdata[3] = (byte)data5; 142 outdata[4] = (byte)data6; 143 outdata[5] = (byte)data3; 144 outdata[6] = (byte)data4; 145 outdata[7] = (byte)data1; 146 outdata[8] = (byte)data2; 147 outdata[9] = 0xD; 148 149 do 150 { 151 if (serialPort1.IsOpen == true) 152 { 153 serialPort1.Write(outdata, 0, outdata.Length); 154 string readData = serialPort1.ReadExisting(); 155 } 156 } 157 while (serialPort1.IsOpen == true); 158 159 System.Threading.Thread.Sleep(50); 160 } 161 outdata[0] = 0x53; 162 outdata[1] = 0x30; 163 outdata[2] = 0x30; 164 outdata[3] = 0x30; 165 outdata[4] = 0x30; 166 outdata[5] = 0x30; 167 outdata[6] = 0x30; 168 outdata[7] = 0x30; 169 outdata[8] = 0x30; 170 outdata[9] = 0xD; 171 172 do 173 { 174 if (serialPort1.IsOpen == true) 175 { 176 serialPort1.Write(outdata, 0, outdata.Length); 177 string readData = serialPort1.ReadExisting(); 178 } 179 } 180 while (serialPort1.IsOpen ); 181 182 System.Threading.Thread.Sleep(500); 183 } 184 } 185 186 private void textBox1_TextChanged(object sender, EventArgs e) 187 { 188 Bitmap mojisend = new Bitmap(pictureBox1.Width, pictureBox1.Height); 189 int mojisu, n, X, Y; 190 long color; 191 Color co; 192 193 pictureBox1.Image = null; 194 mojisu = textBox1.Text.Length; 195 196 for (n = 1; n <= mojisu; n++) 197 { 198 Bitmap mojikioku = new Bitmap(pictureBox2.Width, pictureBox2.Height); 199 Graphics g = Graphics.FromImage(mojikioku); 200 StringFormat format = new StringFormat(); 201 Font fnt = new Font("MS 明朝", 18, FontStyle.Regular, GraphicsUnit.Point); 202 format.Alignment = StringAlignment.Center; 203 format.LineAlignment = StringAlignment.Near; 204 g.Clear(Color.White); 205 g.DrawString(textBox1.Text. Substring(n-1,1), fnt, Brushes.Black, 13, 0,format); 206 fnt.Dispose(); 207 g.Dispose(); 208 pictureBox2.Image = mojikioku; 209 Bitmap bitm = new Bitmap(pictureBox2.Image); 210 211 for (Y = 0; Y <= 23; Y++) 212 { 213 for (X = 0; X <= 23; X++) 214 { 215 Graphics tenset = Graphics.FromImage(mojisend); 216 co = bitm.GetPixel(X, Y); 217 color = co.B; 218 if (color == 0) 219 { 220 tenset.DrawEllipse(Pens.Black, (n-1) * 24 + X, Y, 1, 1); 221 tenset.Dispose(); 222 pictureBox1.Image = mojisend; 223 } 224 } 225 } 226 pictureBox2.Image.Dispose(); 227 pictureBox2.Image = null; 228 } 229 } 230 231 private void Button4_Click(object sender, EventArgs e) 232 { 233 if (serialPort1.IsOpen == true) 234 235 serialPort1.Close(); 236 Environment.Exit(0); 237 } 238 239 private void cmdSEND_Click(object sender, EventArgs e) 240 { 241 SENDdeta(); 242 } 243 244 private void timer1_Tick(object sender, EventArgs e) 245 { 246 timer1.Enabled = false; 247 SENDdeta(); 248 timer1.Enabled = true; 249 } 250 251 private void sendroop_Click(object sender, EventArgs e) 252 { 253 if (sendroop.Text == "繰り返し送信") 254 { 255 sendroop.Text = "繰り返し停止"; 256 timer1.Enabled = true; 257 } 258 else 259 { 260 sendroop.Text = "繰り返し送信"; 261 timer1.Enabled = false; 262 } 263 } 264 265 private void TextBox1_GotFocus() 266 { 267 textBox1.SelectionStart = 0; 268 textBox1.SelectionLength = textBox1.Text.Length; 269 } 270 271 private void Form1_FormClosing(object sender, FormClosingEventArgs e) 272 { 273 if (serialPort1.IsOpen == true) 274 serialPort1.Close(); 275 Environment.Exit(0); 276 } 277 } 278}

試したこと

様々なサイトを回り、handshakeやあることを確認したりしました

補足情報

VB.NETのプログラムは6年前に卒業した先輩の残した物なので作成者に聞くことができません

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

brue__akio

2019/12/06 06:50

COMポートは接続出来ています、文字の送信の際にリレー回路が正常に動作しなく、基盤はVBだと正常に動きます
ozwk

2019/12/06 07:31 編集

シリアルモニタでもcom0comとTeratermでもとにかく何でもいいのでVB版ソフトと移植したソフトで同じことをしようとしたときに同じデータが送られているかを確認してください。
brue__akio

2019/12/06 09:12

C#のソフトがデータを送れないでいます
ozwk

2019/12/06 09:14

1バイトも?
brue__akio

2019/12/06 09:22 編集

おそらく、もう一度詳しく調べてみます
ozwk

2019/12/06 09:45

SENDdeta()呼ばれてます?
brue__akio

2019/12/08 23:17

遅れてすみません、自分もそこが出来てないんじゃないかと思っていて…
ozwk

2019/12/08 23:19

思うんだったらConsole.WriteLineでもブレークポイント置くでもいいんで確認しましょう
guest

回答2

0

ベストアンサー

VB.NET で作成した exe は動作するんですよね?

「Telerik JustDecompile」
https://www.telerik.com/products/decompiler.aspx

これを使うと、exe から C# のソースを生成することができるので、生成したソースとコンバージョンしたソースを比較してみてはいかがでしょうか?

Sharp Develop 4 だとソースを直接コンバートできたのですが、サイトが一新されて旧バージョンのダウンロード先がわからなくなってしまいました。(最新バージョンの 5 ではコンバートできません。)

投稿2019/12/06 09:49

編集2019/12/06 09:57
KOZ6.0

総合スコア2707

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コードは読んでませんが、気のついたところを。

serialPort1.PortName = "COM0";

COM0 というデバイス名はありません。
確認してみては。

投稿2019/12/06 06:25

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

brue__akio

2019/12/06 06:47

記載漏れですみませんが、COMポートはcomboboxで変えていてCOMポートの接続は出来ています
y_waiwai

2019/12/06 06:51

接続ができている、とはどうやってそれを確認していますか? 他のPCにシリアル・ポートをつけて、きちんと送信できているか、をモニタしてみてはどうでしょうか。
brue__akio

2019/12/06 07:06

ポートは接続の際にエラーが出ているかいないかを判別するプログラムで、エラーの出ないCOMポートがあるので接続は出来ていると思います。 その上で入力した内容を送ると回路が動かずフリーズしたままになってしまいます
y_waiwai

2019/12/06 07:09

思いますレベルで言われましても。。 繰り返しますが、ポート番号が間違ってます。 デバイスマネージャで、そのシリアル・ポートのCOM番号確認してみましょうよ
brue__akio

2019/12/06 07:31

デバイスマネージャーで確認した所、COM5でした。そして、COMポートはcomboboxで14まで用意してあるので接続は出来ていました
y_waiwai

2019/12/06 07:36

あなたのいう「接続が出来ている」という言葉の意味がわかりませんが、 とにかく別のPCもってきて、シリアル・ポートつないで通信のモニタしてみては? Teratermなどのターミナルソフトでシリアルの通信確認できますよ。
brue__akio

2019/12/06 08:58

色々確認してポートは大丈夫なのですが、データの送信が出来ませんでした
y_waiwai

2019/12/06 09:41

送信ができないのはポートが大丈夫とは言いませんw ポート番号間違ってるんじゃないの? いろいろポート番号変えて、送信できる番号無いか探してみれ
Mithra

2019/12/11 04:10 編集

プログラム-COMポートーシリアルケーブルー基板という構造になっていると思いますが、 この中でデータはどこまで届いているか確認しなさいと助言を貰っているわけですから、 まずはやってみてはいかがですか? もしくは、試したならどのような方法で確認したかを報告する。 ただ、「出来てます」では回答側も困るでしょう。 なぜなら、問題を解決する能力の無い(だから質問している)人の「思い込み」や 「間違った方法論」での確認したは当てにならないからです。 問題の切り分けという基本レベルの確認から始めてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問