2008年8月26日火曜日

BTE061C USBシリアル変換ケーブルをvmwareで使えるか

  • vmware上メニューに「Future Devices USBデバイス」が出てくるので,ONにする.
# lsmod (の一部)
ftdi_sio 37384 0
usbserial 35816 1 ftdi_sio
usbcore 146028 4 ftdi_sio,usbserial,uhci_hcd

# dmesg(の一部)
[30671.587223] usb 1-1: new full speed USB device using uhci_hcd and address 2
[30671.864147] usb 1-1: configuration #1 chosen from 1 choice
[30672.506578] usb 1-2: new full speed USB device using uhci_hcd and address 3
[30672.958196] usb 1-2: configuration #1 chosen from 1 choice
[30672.994393] hub 1-2:1.0: USB hub found
[30677.997793] hub 1-2:1.0: config failed, can't read hub descriptor (err -22)
[30683.004166] usbcore: registered new interface driver usbserial
[30683.004379] /build/buildd/linux-2.6.24/drivers/usb/serial/usb-serial.c: USB Serial support registered for generic
[30683.004552] usbcore: registered new interface driver usbserial_generic
[30683.004581] /build/buildd/linux-2.6.24/drivers/usb/serial/usb-serial.c: USB Serial Driver core
[30683.032964] /build/buildd/linux-2.6.24/drivers/usb/serial/usb-serial.c: USB Serial support registered for FTDI USB Serial Device
[30683.033348] ftdi_sio 1-1:1.0: FTDI USB Serial Device converter detected
[30683.034062] /build/buildd/linux-2.6.24/drivers/usb/serial/ftdi_sio.c: Detected FT232RL
[30683.035487] usb 1-1: FTDI USB Serial Device converter now attached to ttyUSB0
[30683.035544] usbcore: registered new interface driver ftdi_sio
[30683.035623] /build/buildd/linux-2.6.24/drivers/usb/serial/ftdi_sio.c: v1.4.3:USB FTDI Serial Converters Driver

  • 最初,失敗するようだが,しばらくするとttyUSB0として認識されたっぽい.
  • まだ通信を確認してないので眉唾です.
追記
  • main.c

#include <stdio.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include "sio.h"

#define BUFLEN (64)
#define SIO_SPEED B115200

//#define SIO_DEVICE "/dev/ttyS0"
#define SIO_DEVICE "/dev/ttyUSB0"

#define SERVO_ID (1)

int
RSTorqueOnOff(int fd, short sMode)
{
unsigned char sendbuf[BUFLEN];
unsigned char sum;
int i;
int ret;

// バッファクリア
memset(sendbuf, 0x00, sizeof(sendbuf));

// パケット作成
sendbuf[0] = (unsigned char)0xFA; // ヘッダー1
sendbuf[1] = (unsigned char)0xAF; // ヘッダー2
sendbuf[2] = (unsigned char)SERVO_ID; // サーボID
sendbuf[3] = (unsigned char)0x00; // フラグ
sendbuf[4] = (unsigned char)0x24; // アドレス(0x24=36)
sendbuf[5] = (unsigned char)0x01; // 長さ(4byte)
sendbuf[6] = (unsigned char)0x01; // 個数
sendbuf[7] = (unsigned char)(sMode&0x00FF); // ON/OFFフラグ
// チェックサムの計算
sum = sendbuf[2];
for( i = 3; i < 8; i++ ){
sum = (unsigned char)(sum ^ sendbuf[i]);
}
sendbuf[8] = sum; // チェックサム

// 送信
ret = SioWrite(fd, sendbuf, BUFLEN);

return ret;
}

int
RSMove(int fd, short sPos, unsigned short sTime)
{
unsigned char sendbuf[28];
unsigned char sum;
int i;
int ret;

// バッファクリア
memset(sendbuf, 0x00, sizeof(sendbuf));

// パケット作成
sendbuf[0] = (unsigned char)0xFA; // ヘッダー1
sendbuf[1] = (unsigned char)0xAF; // ヘッダー2
sendbuf[2] = (unsigned char)SERVO_ID; // サーボID
sendbuf[3] = (unsigned char)0x00; // フラグ
sendbuf[4] = (unsigned char)0x1E; // アドレス(0x1E=30)
sendbuf[5] = (unsigned char)0x04; // 長さ(4byte)
sendbuf[6] = (unsigned char)0x01; // 個数
sendbuf[7] = (unsigned char)(sPos&0x00FF); // 位置
sendbuf[8] = (unsigned char)((sPos&0xFF00)>>8); // 位置
sendbuf[9] = (unsigned char)(sTime&0x00FF); // 時間
sendbuf[10] = (unsigned char)((sTime&0xFF00)>>8); // 時間
// チェックサムの計算
sum = sendbuf[2];
for( i = 3; i < 11; i++ ){
sum = (unsigned char)(sum ^ sendbuf[i]);
}
sendbuf[11] = sum; // チェックサム

// 送信
ret = SioWrite(fd, sendbuf, BUFLEN);

return ret;
}


int
main(int argc, char *argv[])
{
int ret;
int fd_sio;
unsigned char buf[BUFLEN];

memset(buf, 0, BUFLEN);

fd_sio = SioOpen(SIO_DEVICE, SIO_SPEED, CREAD | CLOCAL | CS8);
fprintf(stderr, "fd=%d\n", fd_sio);

ret = RSTorqueOnOff(fd_sio, 1);

ret = RSMove(fd_sio, 1000, 0);
usleep(2000000);
ret = RSMove(fd_sio, 0, 0);
usleep(2000000);

ret = RSTorqueOnOff(fd_sio, 0 );

SioClose(fd_sio);

return 0;
}


  • sio.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>

#define BUFLEN (64)

int
SioOpen(char *dev, int speed, unsigned int c_flag)
{
int fd;
struct termios ios;

if((fd = open(dev, O_RDWR | O_NDELAY)) < 0) {
perror("SioOpen");
exit(-1);
}

if(!isatty(fd)) {
close(fd);
fprintf(stderr, "%s : is not a tty\n", dev);
exit(1);
}

memset(&ios, 0, sizeof(ios));

ios.c_cflag = c_flag;

cfsetispeed(&ios, speed);
cfsetospeed(&ios, speed);

if(tcsetattr(fd, TCSANOW, &ios) < 0) {
perror("tcsetattr");
exit(-1);
}

return fd;
}

int
SioClose(int fd)
{
return close(fd);
}

int
SioWrite(int fd, unsigned char *buf, int size)
{
int len;

len = write(fd, buf, size);
return len;
}

int
SioRead(int fd, unsigned char *buf)
{
int len;

fprintf(stderr, "SioRead\n");
len = read(fd, buf, BUFLEN);
return len;
}

0 件のコメント: