VMPlayerでシリアルポートの使用方法とは?

このQ&Aのポイント
  • WindowsXPにVMPlayerを入れて、Debianを動かしています。シリアルポートを使うプログラムを書きたいが、Openに失敗する問題が発生。
  • Windows上ではCOM1で通信はできているが、VMPlayerの環境ではシリアルポートをオープンできない。
  • ttyS0またはttyS1でオープンできないため、どこが問題なのか分からない。初心者のため行き詰まっている。
回答を見る
  • ベストアンサー

VMPlayerでシリアルポートの使用

WindowsXPにVMPlayerを入れて、Debianを動かしています。 この環境で、シリアルポートを使うプログラムを書きたいんですが、 Openに失敗します。 VMPlayer、Linuxともに、初心者ですので、行き詰まっております。 Windows上では、COM1で通信はできています。 VMPlayerの起動時に Serial: 8250/16550 driver $Revision: 1.90 $ 4 ports, IRQ sharing enabled serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A 00:09: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A 00:0a: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A と、なっていますが #define DEV_NAME "dev/ttyS1" int main() { int fd; //デバイスファイル オープン fd = open( DEV_NAME, O_RDWR ); if(fd<0) { //オープン失敗 printf("Open fauls \n"); exit(1); } } 抜粋、ではttyS0、でもttyS1でもオープンできません。 どこが、まずいんでしょうか? よろしく、お願いいたいます。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

その仮想マシンの設定ファイル(~.vmx)で シリアルポートの設定はしているのでしょうか? vmxファイルをテキストエディタで開いて、 serial0.present = "TRUE" serial0.fileName = "COM3" のような行はありますか? ちなみに、上記のような行がない状態でもdmesgには >Serial: 8250/16550 driver $Revision: 1.90 $ 4 ports, IRQ sharing enabled >serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A >serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A >00:09: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A >00:0a: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A は出ているようです。

anubis37
質問者

お礼

Wr5さま serial0.present="TRUE" serial0.fileType="device" serial0.filename="COM1" serial0.tryNoRxLoss = "FALSE" serial0.autodetect="TRUE" を追加しました。 これで、VMPlayerのツールバーにシリアルポートが新たに表示されるようになりました。 その後、minitermというソフトをDLしてとりあえず、RS232Cを使っての送受信が できるようになりました。 ちなみに、ツールバーからシリアルポートを切断すると、通信はできなくなります。 ありがとう、ございました。

関連するQ&A

  • Linuxでシリアルポートが利用できません

    Linuxでシリアルポートが利用できません debian5.0.6をdynabook satellite1800で使っています j-pilotで/dev/ttyS0を開こうとすると”dev/ttyS0 そのようなデバイスはありません” とでてきてしまいHotsyncができません。 ほかにネットで色々調べてみると、/dev/ttyS0をopen()しようとした時に ENODEVがかえって来てしまっている事がわかりました。 しかし,ioportやirqは/proc/ioportsや/proc/interruptsをみてみると バイオスで設定されている物と同じでした。 でも/proc/interruputsの一番最後のフィールドにはserialとは載っていませんでした。 あと起動時には [ 27.374146] ali15x3_smbus 0000:00:08.0: ALI15X3_smb region uninitialized - up grade BIOS or use force_addr=0xaddr [ 27.374325] ali15x3_smbus 0000:00:08.0: ALI15X3 not detected, module not inse rted. というエラーがでてました。 自分はpicやpalmがいじりたいのでシリアルポートがないときついです。 どうしたらシリアルポートが使えるようになりますか?

  • 2進数でのシリアル通信

    シリアルを用いてデータを伝送するプログラムを作りたいのですが、よく分かりません。 10進数では出来たのですが2進数に変換する際に上手く行きません。 シリアル通信のプログラムとして以下を使用しています。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <termios.h> #include <fcntl.h> #include <errno.h> #define BAUDRATE B9600 //hentyou-kaisu per second #define BSIZE 64 //byte size #define CR 0x0D // carriage return int fd; //file descriptor 0:H-nyuryoku,1:H-syuturyoku,2;error struct termios otio; int open_serial_port(char *modem_dev) //modem_dev = serial_dev { struct termios ntio; if ((fd = open(modem_dev, O_RDWR | O_NOCTTY)) < 0) { // O_RDWR=read&write O_NOCTTY= perror(modem_dev); exit (1); } tcgetattr(fd, &otio); //tanmatsu-no-now-settei-syutoku memset(&ntio, 0, sizeof(ntio)); ntio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; ntio.c_cc[VTIME] = 0; //burst-de-datadenso-wo-timeout-surutameno-timer ntio.c_cc[VMIN] = 1; //jyusin-moji-no-min tcflush(fd, TCIFLUSH); // not read data-wo flash tcsetattr(fd, TCSANOW, &ntio); //new-tanmatsu-settei-watasu return (0); } void close_serial_port(void) { tcsetattr(fd, TCSANOW, &otio); //motono-settei-ni-modosu close(fd); } int main(int argc, char **argv) { char *serial_dev; // char buf[BSIZE]; //data-wo-kakikomu-buffa-no-top-address char *buf = (char *)malloc(sizeof(char)*64); char msg[BSIZE]; int i,j; j=0; if (argc != 2) { fprintf(stderr, "usage : %s serial_dev\n", argv[0]); exit (1); } serial_dev = argv[1]; //device to write e.g. /dev/ttyUSB0 memset(buf, '\0', BSIZE); //m byte memory block no set \0=char-gatano-0 memset(msg, '\0', BSIZE); //syokika open_serial_port(serial_dev); i = 0; while (1) { //infinite loop sprintf(buf, "%d,", i); //printf-wo-buf-ni j = strlen(buf); write(fd, buf, j); //write to modem-device printf("%s\n", buf); sleep (2); //read(fd, msg, BSIZE); //printf("%s\n", msg); i++; if (i >= 10) i = 0; } close_serial_port(); free(buf); exit (0); } 2進数変換プログラムは、 #include <stdio.h> #include <stdlib.h> int main(void) { int i, n; int bits[1024]; int digit, amari; printf("10進数: "); scanf("%d", &digit); n=0; while(digit>=1){ amari = digit % 2; /* 配列変数に順番に代入して */ bits[n++] = amari; digit = digit / 2; } /* 逆順に表示している */ for(i=n-1; i>=0; i--){ printf("%d", bits[i]); } printf("\n"); return 0; } この両者をつなぎ合わせたいのですが、どうすればよろしいでしょうか。

  • シリアル通信でのread関数の戻り値

    オムロン製PLCと上位コンピュータをRS232Cで接続し、FINSコマンドを用いてシリアル通信をしようとしています。 現在作っているプログラムの流れは、 ・シリアルポート"/dev/ttyS2"のオープン   comm_fd = open("/dev/ttyS2", O_RDWR | O_NOCTTY); ・通信設定   termios構造体を設定 ・コマンドフレーム(COMMAND)を作成し、ポートに書き込む   write(comm_fd, &COMMAND, strlen(COMMAND)); ・PLCからのレスポンスを読み出す   read(comm_fd, &RESPONSE, 256); のようにしているのですが、read関数が実行されたままになってしまいます。(エラーコードも返ってこない状態です) readの戻り値が-1ならポートにアクセスできていないとわかるのですが… ためしにcomm_fdと違う値をread関数に入れてみたところ(read(6, &RESPONSE, 256)、戻り値は-1となりました。 これはどういう状態になってしまっているのでしょうか? わかりにくい質問で申し訳ありません。

  • C言語のシリアル通信について

    C++でプログラムを書き、シリアル通信(RS232C)を使ってデバイスを動かしたいと試みているのですがよくわからないのでアドバイスお願いします。(OSはlinux) デバイス特有の命令を送るところがよくわかりません。(命令はキャラクタではなくバイナリで送らなければなりません。) 命令はバイナリデータです。 例、 char i[]={255,20,0,10}; ↑このようなデータです。 このようなデータを送る際はfwrite関数を使うということは調べたのですがどのように表すかわからないので教えていただきたいです。 初めのシリアルポートを開く際に”wb”をつけないといけないみたいですがどのようにつければいいのでしょうか。 fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NONBLOCK); if(fd<0) { printf("erroe\n"); exit(-1); } ↑自分が書いたポートを開く時のプログラムです。最初の行の最後に”wb"を付け足せば良いのですか。 上記の例のような命令を送るとすると fwrite(&i,sizeof(char),4,fd); return 0; で良いでしょうか。warningがでて動作しないのでアドバイスよろしくお願いします。 説明が下手で申し訳ありません。一番わからない点はシリアル通信で命令を送るときのポートオープンとfwriteを使った命令を送る形式です。どうぞよろしくお願いします。

  • ubuntuでVMplayerが動きません

    実験のためにubuntuのubuntu-ja-8.04-vmware-i386へ VMPLAYER.3.1をバイナリインストールは うまくいったのですが 実際にバーチャルマシンを起動すると 下のようなエラーが出て動きません vmmonがないといわれているのはわかるのですが どうやったら、できるのか検討がつきません よろしくお願いします。 エラーメッセージ Could not open /dev/vmmon: No such file or directory Please make sure that the kernel module 'vmmon' is loaded

  • コンパイルに失敗します。(RaspberryPi)

    lwiringPiとOpenRTM-aistインストール済み ===コマンド===== gcc kasoku.c -lwiringPi =========== ======エラー=========== kasoku.c: In function ‘main’: kasoku.c:48:29: error: ‘rtc’ undeclared (first use in this function) kasoku.c:48:29: note: each undeclared identifier is reported only once for each function it appears in ========== ======ソースコード======== #include <stdio.h> #include <stdlib.h> #include <time.h> #include <unistd.h> #include <linux/i2c-dev.h> // I2C用インクルード #include <fcntl.h> #include <sys/ioctl.h> #include <wiringPi.h> // delay関数用にインクルード void L3GD20_readData(int *gyrodata, int fd); void L3GD20_write(unsigned char address, unsigned char data, int fd); unsigned char L3GD20_read(unsigned char address, int fd); void L3GD20_init(int fd); int main(int argc, char **argv) { int i2c_fd; // デバイスファイル用ファイルディスクリプタ // char *i2cFileName = "/dev/i2c-0"; // I2Cデバイスファイル名 char *i2cFileName = "/dev/i2c-1"; // RaspberryPiのリビジョンに合わせて変更 int i2cAddress = 0x6a; // L3GD20のI2Cアドレス int gyroData[3]; // ジャイロ3軸(x,y,z)データ格納用 printf("i2c Gyro(L3GD20) test program\n"); delay(500); // I2Cデバイスファイルをオープン if ((i2c_fd = open(i2cFileName, O_RDWR)) < 0) { printf("Faild to open i2c port\n"); exit(1); } // L3GD20用にセット if (ioctl(i2c_fd, I2C_SLAVE, i2cAddress) < 0) { printf("Unable to get bus access to talk to slave\n"); exit(1); } //デバイスイニシャライズ L3GD20_init(i2c_fd); // 1秒ごとに20回ジャイロデータを取得、表示 int i; for(i=0; i<20; i++){ // デバイスからデータ取得 L3GD20_readData(gyroData, rtc); // 取得したデータを校正して表示、1秒待ち printf("x, y, z : %5.2f, %5.2f, %5.2f\n",(float)gyroData[0]*0.00875,(float)gyroData[1]*0.00875,(float)gyroData[2]*0.00875); delay(1000); } return; } // L3GD20用 1バイト書き込みルーチン:addressで示すレジスタにdataを書き込む void L3GD20_write(unsigned char address, unsigned char data, int fd) { unsigned char buf[2]; buf[0] = address; buf[1] = data; if((write(fd,buf,2))!=2){ printf("Error writing to i2c slave\n"); exit(1);} return; } // L3GD20用 1バイト読み出しルーチン:addressで示すレジスタの値を読み出す // 戻り値がレジスタ値 unsigned char L3GD20_read(unsigned char address, int fd) { unsigned char buf[1]; buf[0] = address; if((write(fd,buf,1))!= 1){ // addressを一度書き込む所に注意 printf("Error writing to i2c slave\n"); exit(1);} if(read(fd,buf,1)!=1){ printf("Error reading from i2c slave\n"); exit(1);} return buf[0]; } // L3GD20用 ジャイロデータ読み出しルーチン:整数値配列へのポインタを使ってデータを受け渡す void L3GD20_readData(int *gyrodata, int fd) { unsigned char data[6]; // センサから3軸に対して2バイトずつデータを読み出す int i; for(i=0; i<6; i++){ data[i]=L3GD20_read(0x28+i,fd); } // 各数値を32bit幅の整数に整形する // センサの数値精度が16bit・2の補数表現での出力のため、シフトで加工 gyrodata[0]=((int)data[1]<<24|(int)data[0]<<16)>>16; gyrodata[1]=((int)data[3]<<24|(int)data[2]<<16)>>16; gyrodata[2]=((int)data[5]<<24|(int)data[4]<<16)>>16; return; } // L3GD20用 ジャイロデータイニシャライズルーチン void L3GD20_init(int fd) { unsigned char Data; printf("L3GD20 init seq. start\n"); // L3GD20 動作確認 // L3GD20の0x0fレジスタは常に0xd4にセットされているため動作確認ができる Data = L3GD20_read(0x0f,fd); if(Data != 0xd4){ printf("L3GD20 is not working\n"); exit(1);} delay(10); // レジスタへの書き込みチェックとイニシャライズを同時に行う printf("read OK, Now writing check...\n"); // 0x20レジスタに0x0fを書き込むことで動作させる L3GD20_write(0x20, 0x0f, fd); // 0x20レジスタに実際に0x0fが書かれたか確認 Data = L3GD20_read(0x20,fd); if(Data != 0x0f){ printf("Writing miss\n"); exit(1); } printf("Writing OK\n"); delay(10); return; } ===============

  • PC/ATでのシリアルポートの操作

    PC/AT互換機でI/Oアドレスの03F8h-03FFhから シリアルポートのDTR,DSR,RTS,CTSを操作したいのですが、 その方法を知りたいです。 回答をよろしくお願いします。

  • 大文字を小文字に、小文字を大文字にするプログラム

    問題は、 ファイルにあるアルファベットの大文字を小文字に変換し、小文字は大文字に変換して、ファイルに保存するプログラムを作りなさい というものです。 色々考えて、 #include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <unistd.h> #include <ctype.h> int main(int argc,char **argv){ int fd,flag1,flag2; int i,n; char buffer[512],x; fd = open(argv[1],O_RDWR); if(fd == -1) perror("open"); while((n = read(fd,buffer,sizeof(buffer)))>0){ x = buffer[i]; flag1 = islower(x); flag2 = isupper(x); for(i=0;i<n;++i) if(flag1 == 1){ buffer[i] = toupper(buffer[i]); }else if(flag2 == 1){ buffer[i] = tolower(buffer[i]); } write(fd,buffer,n); } close(fd); exit(0); } のようなプログラムを考えましたが、うまくいきません。 toupperのような関数を使ったのは初めてなのでよく使い方が分からずこのようなプログラムになってしまいました。 どうか正しく動くようなプログラムを教えてください。お願いします。

  • パラレルポートのリソース

    東芝のサテライトJ63というパソコンで、 WindowsXPのデバイス マネージャ プリンタ ポート (LPT1) リソースの種類  設定 I/Oの範囲     0378 - 037F I/Oの範囲     0778 - 077B  IRQ    07 DMA 01 となっていたのですが、ハードウエアキーが認識しないのでいろいろとさわっていて、リソースを変更してしまい I/Oの範囲     0378 - 037F これだけしか出てこなくなりました。 結局、ハードウエアキーが認識しないのはリソースのせいではないことがわかったのですが、認識しません。いま、認識しないのはリソースを変更したからではないかと思っています。もとに戻したいのですがどうしたらよいかわかりません。リカバリーしましたがここの設定が元に戻りません。 どうしたらよいでしょうか? 会社のPCで責任感じています。 助けてください。

  • sttyで通信速度の設定が出来ない

    今まで使用していたサーバーが壊れてしまい 新しいサーバーをセットアップしていましたが シリアルポートの速度の設定がうまくいきません root でログインし stty -F /dev/ttyS0 9600 cs8 -parenb cstopb と打ち込んでも stty -F /dev/ttyS0 -a で確認してみると speed 38400 と表示されてしまいます 他に何か設定が必要なのでしょうか? 環境 RedHat Enterprise Linux Server release 5.3 linux 2.6.18 サーバー DELL PowerEdge R200

専門家に質問してみよう