VMware6.0中的Linux不能使用串口的raw mode?
通过vm->settings添加主机物理串口COM1
从外部设备传来的数据0xff(已经在win32下验证无误),在虚拟机中的Linux下显示为0x7f
下面是我的测试代码:
#include <stdio.h> /* 标准输入输出定义 */
#include <stdlib.h> /* 标准函数库定义 */
#include <unistd.h> /* Unix标准函数定义 */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> /* 文件控制定义 */
#include <termios.h> /* POSIX 终端控制定义 */
#include <errno.h> /* 错误号定义 */
/* 仅用于打开固定的串口,串口工作参数也是硬编码的 */
int OpenUart(char *pDev, int iFlag)
{
int fd;
struct termios Opt;
/*以读写方式打开串口*/
fd = open( pDev, iFlag );
if ( -1 == fd ){
perror("无法打开/dev/ttyS0,请检查该设备是否存在,及其访问权限\n");
return -1;
}
// 设置参数
tcgetattr( fd, &Opt );
cfsetispeed( &Opt, B38400 ); /* 设置为 38400 bps */
cfsetospeed( &Opt, B38400 ); /* 只有很少的硬件支持输入/输出波特率不同 */
Opt.c_cflag &= ~CSIZE;
Opt.c_cflag |= CS8;
Opt.c_cflag |= ( PARODD | PARENB ); /* 设置为奇效验 */
Opt.c_iflag |= INPCK; /* enable parity checking */
Opt.c_cflag &= ~CSTOPB; /* 1 stop bit */
tcflush( fd, TCIOFLUSH );
Opt.c_cc[VTIME] = 15; /* 设置超时 1.5 seconds */
Opt.c_cc[VMIN] = 0; /* Update the options and do it NOW */
/* for raw mode */
//Opt.c_lflag &= ~( ICANON | ECHO | ECHOE | ISIG ); /* Input */
//Opt.c_oflag &= ~OPOST; /* Output */
if( 0 != tcsetattr( fd, TCSANOW, &Opt )){
return -1;
}else{
return fd;
}
}
int main(void)
{
int fd,i,iCnt;
unsigned char buff[16];
fd = OpenUart("/dev/ttyS0", O_RDWR);
if (-1 == fd )
{
return(-1);
}
else{
printf("open ttyS0 .....\n");
}
//fcntl(fd, F_SETFL, 0); //恢复串口的状态为阻塞状态,用于等待串口数据的读入
while(1)
{
do{
iCnt = read(fd,buff,16);
}while(iCnt == 0);
for(i=0; i<iCnt; i++){
printf("%02X,",buff[i]);
}
printf("\n");
}
close(fd);
return;
}