シリアルポート(rs232)モノのためのマルチプラットフォーム
-
10-07-2019 - |
質問
私は企画の再作成Win32アプリケーション(ネイティブC++)です。当番があるのだろんでWin32、Linuxおよびmacです。問題はっ(有するものを開発しWin32)のシリアルポート定義で設定します。にはどうすればよい一般的に特定の違いるときにプラットフォームがありないとみられる実行形式にまとめたものです。具体的には、COMポートを特定する窓としてCOM1いのも長いのもどっちも似合い(\.\COM)がlinuxで設定しなければならないようなものとして/dev/ttyS0.
なチェックのプラットフォーム実行のためにこれらの情報?
と思うに違い型違い希望アレばすると、開閉のポートです。の読み書きも同じです。
そこがますます重要になっていく。質問とその他プラットフォーム固有のもmono/.います。
どのような取り扱っています。一部の文字列の資源またはconfigファイル、またはハードコーディングおよびスイッチに基づく実行ます。
他のコード例です。注am a C++開発者とのないすべてのクラスを利用可能です。います。がわかりやすく伝えるためのいずれかのシリアルポート名スキームからのCLRそれをわかりやすく伝えるためのOS/プラットフォームのCLR?
そしてもらったのもよかったのCLRができて本当に現在のシリアルポートにより独立した生活を送っている。それはできません。
おかげさ Tim
編集
さらに一応これまでといったところかけてみての
SerialPort.GetPortNames()列挙最初にします。(両プラットフォーム)
にwin32の高いポート番号や断USBドングルなどの基本的なCOMポート一覧取得を行います。
ましたのでご報告の成果です。
解決
そういえばこっちだとこのスレッドとは思aughtるだけで追加発見:ランダムに私は不安を感じつつもこのmac.WindowsおよびLinux(VSモノも)SerialPort.GetPortNames()リストを返し、以下のルール:
1)Windowsのリストを返すものの文字列のようにCom1,Com4,逃せない存在(USBシリアルアダプターにより知られCOM数のプラグインで接続し、consistantly)からシリアルポートスキャナー:
Scanning COM1
Scanning COM4
Scanning Complete
2)Linuxのすべての年のデータがttyシリアルポートのコンパイラのlinux distroが有効になります。といっていいのかもしれない約8ポートをしようとした場合に、例外をスローしますから私のシリアルポートスキャナー:
Scanning /dev/ttyS0
Scanning /dev/ttyS1 Port FailedSystem.IO.IOException: I/O Error
at System.IO.Ports.SerialPortStream..ctor (System.String portName, Int32 baudRate, Int32 dataBits, Parity parity, StopBits stopBits, Boolean dtrEnable, Boolean rtsEnable, Handshake handshake, Int32 readTimeout, Int32 writeTimeout, Int32 readBufferSize, Int32 writeBufferSize) [0x00000]
at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPortStream:.ctor (string,int,int,System.IO.Ports.Parity,System.IO.Ports.StopBits,bool,bool,System.IO.Ports.Handshake,int,int,int,int)
at System.IO.Ports.SerialPort.Open () [0x00000]
at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPort:Open ()
at HSMScanner.Program.Main (System.String[] args) [0x00000]
Scanning /dev/ttyS2 Port FailedSystem.IO.IOException: I/O Error
at System.IO.Ports.SerialPortStream..ctor (System.String portName, Int32 baudRate, Int32 dataBits, Parity parity, StopBits stopBits, Boolean dtrEnable, Boolean rtsEnable, Handshake handshake, Int32 readTimeout, Int32 writeTimeout, Int32 readBufferSize, Int32 writeBufferSize) [0x00000]
at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPortStream:.ctor (string,int,int,System.IO.Ports.Parity,System.IO.Ports.StopBits,bool,bool,System.IO.Ports.Handshake,int,int,int,int)
at System.IO.Ports.SerialPort.Open () [0x00000]
at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPort:Open ()
at HSMScanner.Program.Main (System.String[] args) [0x00000]
Scanning /dev/ttyS3 Port FailedSystem.IO.IOException: I/O Error
at System.IO.Ports.SerialPortStream..ctor (System.String portName, Int32 baudRate, Int32 dataBits, Parity parity, StopBits stopBits, Boolean dtrEnable, Boolean rtsEnable, Handshake handshake, Int32 readTimeout, Int32 writeTimeout, Int32 readBufferSize, Int32 writeBufferSize) [0x00000]
at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPortStream:.ctor (string,int,int,System.IO.Ports.Parity,System.IO.Ports.StopBits,bool,bool,System.IO.Ports.Handshake,int,int,int,int)
at System.IO.Ports.SerialPort.Open () [0x00000]
at (wrapper remoting-invoke-with-check) System.IO.Ports.SerialPort:Open ()
at HSMScanner.Program.Main (System.String[] args) [0x00000]
3)Mac...
まあまあ.Mac(usbシリアルポートを使用し、ドライバーもすべてがokになりたい方は返却 何 のGetPortNames().灘.見る/dev/tty、余分な機器が表示される場合にのみデバイスが接続していった名前を/dev/tty.usbserial-A7006Ro7unfortunatly、この名前を引数としてのプログラムの後、serial.開dosntされているわけではなさそうだ。
なります。
他のヒント
.Netでは、System.IO.Portsが必要です。 " COM1"などの名前および" / dev / ttyS0"ランダムなOS名です。なぜそれらをハードコードする必要があるのですか?ユーザーは、使用可能なポートのリストから1つを選択するだけです。
明らかに、実行時にこのリストを決定します。実際、USB-シリアルアダプターを使用する場合、ユーザーがプログラムを起動した後に初めて、USB-シリアルアダプターを接続するのを忘れた可能性を考慮する必要があります。つまり、設定ダイアログを表示するたびにこのリストを読み直す必要があります。 USBアダプターはCOM1、BTWではない可能性が高いです。
(SerialPortのMono実装の品質を保証することはできません。簡単なGoogle検索で少し心配しましたが、自分でテストしてください)
これを見て、シリアルポートを列挙するためのモノラルコードはLinux以外では動作しないようです。
(mcs / class / System / System.IO.Ports / SerialPort.csから)
public static string [] GetPortNames ()
{
int p = (int) Environment.OSVersion.Platform;
List<string> serial_ports = new List<string>();
// Are we on Unix?
if (p == 4 || p == 128 || p == 6) {
string[] ttys = Directory.GetFiles("/dev/", "tty*");
foreach (string dev in ttys) {
if (dev.StartsWith("/dev/ttyS") || dev.StartsWith("/dev/ttyUSB"))
serial_ports.Add(dev);
}
} else {
OSXでは、おそらく/dev/tty.*に一致すると思います(FreeBSDには/ dev / ttyU [0-9] +が必要です)
どちらのOSで実行されているかを選択する方法に夢中になっているとは言えません。