AIX环境下串口读取问题

bnxf88 2005-11-03 03:28:14
请教各路高手:
我在AIX环境下对串口进行读写,读取的数据信息中包含字符0,比如读取的数据串为1134002332;
则在AIX环境下接收的数据会变成1134、2332;字符0的信息被丢弃;我看了串口的设置,其eol(换行命令符)=^@;在配置中指向为0;也即系统任务接收的字符00为换行符而丢弃了;同样的程序在SCO 环境下执行则没问题。
想请教各位高手,怎样设置AIX中的串口参数,使得其接收字符串中能包含00字符。
...全文
186 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
bnxf88 2005-11-10
  • 打赏
  • 举报
回复
怎再没有高手肯指教了呢,结贴了!
bnxf88 2005-11-07
  • 打赏
  • 举报
回复
谢谢blueflame(蓝色的火焰),我已试过你说的方法,将lflag 置位为~ICANON,
不过结果还是一样,真晕死了!
bnxf88 2005-11-04
  • 打赏
  • 举报
回复
不好意思,上面程序的接收部分是我测试时改的,有点问题,应是:
/*接收命令*/

while( iLen< 140 && i<3 )
{
sleep( 1 );
nread = read( fd, sbuff+iLen, 140-ilen);
iLen+=nread;
i+=1;
}
bnxf88 2005-11-04
  • 打赏
  • 举报
回复
我的程序代吗如下,恳请各位帮忙看看:
奇怪的是,同样的程序在SCO UNIX下运行则没有任何问题



/************************************************************
*函数名称:set_Parity
*函数功能:设置串口数据位,停止位和效验位
*函数参数:fd-打开串口的文件句柄,databits-数据位(=7,8),
* stopbits-停止位(=1,2),parity- 效验类型(=N,E,O, ,S)
*函数返回:0-OK,-1-FAIL
*函数说明:设置串口通信速率
*************************************************************/
int set_Parity( int fd,int databits,int stopbits,int parity )
{
int iRt;
struct termios options;

iRt=tcgetattr( fd,&options);
if( iRt != 0 )
{
return -1;
}
options.c_cflag &= ~CSIZE;
/*设置数据位数*/
switch( databits )
{
case 7:
options.c_cflag |= CS7;
break;
case 8:
options.c_cflag |= CS8;
break;
default:
return -1;
}

switch (parity)
{
case 'n':
case 'N':
options.c_cflag &= ~PARENB; /* Clear parity enable */
options.c_iflag &= ~INPCK; /*Enable parity checking*/
break;
case 'o':
case 'O':
/*设置为奇效验*/
options.c_cflag |= (PARODD | PARENB);
options.c_iflag |= INPCK; /*Disnable parity checking*/
break;
case 'e':
case 'E':
options.c_cflag |= PARENB; /* Enable parity */
options.c_cflag &= ~PARODD; /* 转换为偶效验*/
options.c_iflag |= INPCK; /*Disnable parity checking*/
break;
case 'S':
case 's': /*as no parity*/
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
break;
default:
return -1;
}
/* 设置停止位*/
switch (stopbits)
{
case 1:
options.c_cflag &= ~CSTOPB;
break;
case 2:
options.c_cflag |= CSTOPB;
break;
default:
return -1;
}

/* Set input parity option */
if (parity != 'n')
{
options.c_iflag |= INPCK;
}

tcflush(fd,TCIFLUSH);
options.c_cc[VTIME] = 50; /* 设置超时5 seconds*/
options.c_cc[VMIN] = 0;
/* Update the options and do it NOW */
if( tcsetattr(fd,TCSANOW,&options) != 0)
{
return -1;
}
return 0;
}

/************************************************************
*函数名称:OpenDev
*函数功能:打开串口
*函数参数:Dev-对应串口
*函数返回:0-OK,-1-FAIL
*函数说明:打开串口
*************************************************************/
int OpenDev(char *Dev)
{
int fd;

fd = open( Dev, O_RDWR|O_NOCTTY ); /**| O_NOCTTY | O_NDELAY**/
return fd;
}


/************************************************************
*函数名称:Main
*函数功能:主函数?
*函数参数:argc,agrv[]
*函数返回:0-OK,-1-FAIL
*函数说明:读写串口
*************************************************************/
int main(int argc, char **argv)
{
int rc;
int fd;
int nread,iLen;
int i;
unsigned char sCmd[6];
unsigned char sbuff[256];
char sdev[32];


memset( sdev,0,sizeof( sdev ) );
sprintf( sdev,"%s",argv[1] );

/**打开串口**/
errno=0;
fd = OpenDev( sdev );
if( fd < 0 )
{
return -1;
}

/*设置波特率*/
rc=set_Speed( fd,9600);
if( rc )
{
return -1;
}
/**设置参数**/
rc=set_Parity( fd,8,1,'N');
if( rc )
{
WriteLog("Set Parity Error\n");
return -1;
}

memset( sCmd,0,sizeof( sCmd ) );
sCmd[0]=0x1;
sCmd[1]=0x1;
sCmd[2]=0x2;
sCmd[3]=0xFC;
sCmd[4]=0xFF;
errno=0;
/**发送命令**/
rc=write( fd, sCmd,strlen( sCmd ) );
if( rc>0 )
{
for(i=0;i<5;i++)
{
WriteLog( "sCmd[%ld]=%ld.\n",i,sCmd[i] );
}
}
else
{
return -1;
}


i=0;
nread=0;
iLen=0;
memset( sbuff,0,sizeof( sbuff ) );
/*接收命令*/
while( iLen< 140 && i<3 )
{
sleep( 1 );
nread = read( fd, sbuff+iLen, 1);
iLen+=nread;
i+=1;
}
close( fd );

/**对接收的数据进行处理**/
...
return 0;
}
blueflame 2005-11-04
  • 打赏
  • 举报
回复
呵呵,没什么好奇怪的,AIX是混有4.3BSD“血统”的,这跟SCO不同,不同内核版本在POSIX.1的基础上另外添加了一些特殊输入字符,具体楼主可以参见APUE的终端I/O部分,我记得里面有两个表是关于这些终端标志和特殊字符的。楼主试过之前我说的做法了吗?
blueflame 2005-11-03
  • 打赏
  • 举报
回复
估计跟你串口初始化时的lflag中没有~ICANON有关
hundlom 2005-11-03
  • 打赏
  • 举报
回复
把你读数据的代码贴出来看看

23,121

社区成员

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

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