VMware6.0中的Linux不能使用串口的raw mode?

mxh0506 2008-11-13 03:08:58
通过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;
}
...全文
240 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧