linux下串口读写问题

LJJgood 2014-05-08 05:11:54
各位大虾:
小弟现在做串口通讯问题,是在linux环境下。
写串口数据没有问题,因为我调用我的写串口程序,写入串口数据后,在电脑的串口调试工具中能够看到我写的内容。但是我在调用我的串口数据时发生了错误.
错误如下:
在使用串口调试工具想串口发送数据时,在需要发送的数据前面 如果不加回车的话 无法读取串口数据。必须在发送数据的前面加一个回车键 才可以。 真不知道怎么回事,都好几天了。代码如下
如果不加回车键 只能在 ioctl(fd,FIONREAD,&nbytes);//查询输入缓冲区中的字节数 中 输出缓冲区写入的字节大小 而读串口返回值确实0!!!
int serialopen(char *device)
{

int fd;
struct termios tios;
speed_t speed = B115200;
if ((fd = open(device, O_RDWR|O_NOCTTY)) < 0)
{
CALOG(">>>>>open serial device erro<<<<<<");
return -1;
}

tcgetattr(fd, &tios);
if (cfsetispeed(&tios, speed) < 0)
{
CALOG(">>>>>cfsetospeed setting seer<<<<<<");
close(fd);
return -1;
}
if(cfsetospeed(&tios, speed)<0)
{
CALOG(">>>>>cfsetispeed setting seer<<<<<<");
close(fd);
return -1;
}

tios.c_cc[VMIN] = 0;

tios.c_iflag |= BRKINT;
//tios.c_iflag |= IGNCR; //忽略输入的回车键
/*没有奇偶校验*/
tios.c_cflag &= ~PARENB;
tios.c_cflag |= CSTOPB; //设置停止位 2位停止位
tios.c_cflag|=CLOCAL; //修改控制模式,保证程序不会占用串口
tios.c_cflag &= ~CSIZE; //屏蔽其他标志位
tios.c_cflag |= (B115200|CS8|CREAD); //设置波特率 8位数据位 可从串中读取数据
tios.c_oflag &= ~OPOST; //原始数据输出模式
tios.c_lflag &= ~(ICANON|ECHO|ECHOE );//不经处理直接发送
//tios.c_lflag |= (ICANON | ECHO );//经典输入模式

tcflush(fd, TCIOFLUSH);
if (tcsetattr(fd, TCSAFLUSH, &tios) < 0) {

CALOG(">>>>>>>>>>>tcsetattr setting erro<<<<<<<<<<<<");
(void)close(fd);
return -1;
}
tcflush(fd,TCIOFLUSH);
return fd;
}
int serialread(int fd, int timeout,char *String)
{
fd_set fds;
struct timeval tv;
int n;
char ch[640*500*3] = {0};
char * ptr = ch;
char ptt[640*500*3] ={0};
tv.tv_sec = timeout;
tv.tv_usec = 0;

FD_ZERO(&fds);
FD_SET(fd, &fds);
int nbytes,nbyte;
if ((n = select(fd + 1, &fds, NULL, NULL, &tv)) < 0)
return SERIAL_ERROR;

if (n == 0)
return SERIAL_TIMEOUT;

int count = 0;
ioctl(fd,FIONREAD,&nbytes);//查询输入缓冲区中的字节数
CALOG(">>>>>>>>>>nbytes = %d<<<<<<<\n",nbytes);
if(nbytes>0)
{
CALOG(">>>>>>>>>>rtrtrtr<<<<<<<\n");
while(1)
{
nbyte=read(fd,ptr,1);
CALOG(">>>>>>>>>>nbyte[%d] = %d<<<<<<<\n",count,nbyte);
CALOG(">>>>>>>>>>ptr[0] = %d<<<<<<<\n",ptr[0]);
if(nbyte>0&count>=1)
{
memcpy(&ptt[count-1],ptr,nbyte);
CALOG(">>>>>>>>>>ptt[%d] = %d<<<<<<<\n",count,ptt[count]);

}
if(nbyte<=0&count ==0)
{
CALOG(">>>>>>>>>>read serial erro<<<<<<<\n");
return SERIAL_ERROR;
}
if(nbyte<=0&count>1)
{
memcpy(&String[count],ptr,nbyte);
String[count+1] = '\0';
break;
}
count+=nbyte;
}
}
else
{
CALOG(">>>>>>>>>>the data is null<<<<<<<<\n");
return SERIAL_EOF;
}
int i = 0;
for(i =0;i<8;i++)
{
CALOG(">>>>>>>>>>ptt[%d] = %d<<<<<<<<\n",i,ptt[i]);
}
CALOG(">>>>>>>>>>ptt = %s<<<<<<<<\n",ptt);
return count-1;
分数不多 还请各位大神帮帮忙啊
...全文
114 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,318

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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