お世話になります。
行いたいこと
mbed(送信)とC#(受信)でシリアル通信を行いたいと思っております。
mbed: 「abced...xyz\n」という文字列を送信
c#: 上記の文字列を一括で受信したい
問題点
下記に示すソースコードで検証した場合、文字列を一括ではなく、14文字区切り単位でしか受信できません。
コンソール(受信例)
abcdefghijklmn
opqrstuvwxyzab
cdefghijklmnop
qrstuvwxyzabcd
...
質問
14文字区切り単位ではなく、「abced...xyz\n」という風に一括で受信したいと考えております。
解決策をご存知の方は、ご教示いただければ幸いです。
よろしくお願い致します。
環境
C#: .NET FW 4.6.1, VS Pro 2017
mbed: NXP LPC1768
以下、ソースコード
▼受信側C#
C#
1public SerialPort Port; 2 3public void main(){ 4 Port = new SerialPort(port, 9600, Parity.None, 8, StopBits.One); 5 Port.Open(); 6 Port.DataReceived += SrialPortDataReceived; 7} 8 9private void SrialPortDataReceived(object sender, SerialDataReceivedEventArgs e) 10{ 11 var sp = sender as SerialPort; 12 if (Port.BytesToRead > 0) 13 { 14 byte[] b = new byte[Port.BytesToRead]; 15 sp.Read(b, 0, b.Length); 16 17 string text = System.Text.Encoding.ASCII.GetString(b).Replace("\n", ""); 18 Console.WriteLine(text); 19 } 20}
▼送信側mbed
Cpp
1#include "mbed.h" 2 3Serial pc(USBTX, USBRX); // tx, rx 4 5int main() { 6 while(1) { 7 pc.printf("abcdefghijklmnopqrstuvwxyz"); 8 wait_ms(50); 9 } 10}
修正後
C#
1 public SerialPort Port; 2 3 public void main() 4 { 5 var port = GetPortName(); 6 if (port != null) 7 { 8 try 9 { 10 Port = new SerialPort(port, 9600, Parity.None, 8, StopBits.One); 11 Port.Open(); 12 while (true) 13 { 14 var msg = Port.ReadLine(); 15 Console.WriteLine(msg); 16 } 17 } 18 catch (ArgumentException ae) 19 { 20 Console.WriteLine(ae); 21 } 22 catch (SystemException se) 23 { 24 Console.WriteLine(se); 25 } 26 } 27 } 28 29 private IEnumerable<string> GetSerialDeviceNames() 30 { 31 // System.Managementを参照に追加 32 var pnpEntity = new ManagementClass("Win32_PnPEntity"); 33 var comRegex = new Regex(@"(COM[1-9][0-9]?[0-9]?)"); 34 35 return pnpEntity 36 .GetInstances() 37 .Cast<ManagementObject>() 38 .Select(managementObj => managementObj.GetPropertyValue("Name")) 39 .Where(nameObj => nameObj != null) 40 .Select(nameObj => nameObj.ToString()) 41 .Where(name => comRegex.IsMatch(name)); 42 } 43 44 private string GetPortName() 45 { 46 foreach (string device in GetSerialDeviceNames()) 47 { 48 if (device.Contains("mbed")) 49 { 50 var com = new Regex(@"[^0-9]").Replace(device, ""); 51 int num; 52 if (int.TryParse(com, out num)) 53 { 54 return ("COM" + num); 55 } 56 } 57 } 58 59 return null; 60 }
Cpp
1#include "mbed.h" 2 3Serial pc(USBTX, USBRX); // tx, rx 4 5int main() { 6 while(1) { 7 pc.printf("abcdefghijklmnopqrstuvwxyz\n"); 8 wait_ms(50); 9 } 10}
エラー
...
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
'Hoge.exe' (CLR v4.0.30319: Caracol.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.resources\v4.0_4.0.0.0_ja_b77a5c561934e089\System.resources.dll' が読み込まれました。モジュールがシンボルなしでビルドされました。
例外がスローされました: 'System.IO.IOException' (System.dll の中)
System.IO.IOException: スレッドの終了またはアプリケーションの要求によって、I/O 操作が中止されました。
場所 System.IO.Ports.SerialStream.EndRead(IAsyncResult asyncResult)
場所 System.IO.Ports.SerialStream.Read(Byte[] array, Int32 offset, Int32 count, Int32 timeout)
場所 System.IO.Ports.SerialStream.Read(Byte[] array, Int32 offset, Int32 count)
場所 System.IO.Ports.SerialPort.InternalRead(Char[] buffer, Int32 offset, Int32 count, Int32 timeout, Boolean countMultiByteCharsAsOne)
場所 System.IO.Ports.SerialPort.ReadTo(String value)
場所 System.IO.Ports.SerialPort.ReadLine()
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/04 06:59
2019/07/04 07:14
2019/07/04 07:19
2019/07/04 08:21