我现在用开发板(友善之臂的)去控制一个传感器,当我发送命令数据给传感器,传感器会马上返回一个数据,他们之间是用串口通信的,下面是我的程序,现在我的问题是当我在PC机上用交叉编译工具编译后在开发板上运行便会在read()函数那里阻塞,阻塞我用select已经解决了,但是read函数却一直返回0,请问大家这是什么原因,帮帮忙谢谢了。。
这是我的程序,当我在LINUX下通过交叉编译工具编译,在开发板上运行,read()这个函数中就会有问题,会一直返回0;
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<termios.h>
#include<getopt.h>
#define PORT 12345
int main(int argc,char **argv)
{
int buf[1024]={};
int commfd,ttyfd;
struct termios ttyattr;
int fp=open("/dev/ttySAC3",O_RDWR | O_NONBLOCK);
if(fp==-1)
{
perror("open failed");
return -1;
}
//memset(&ttyattr,0,sizeof(struct termios));
tcgetattr(fp,&ttyattr);
cfsetispeed(&ttyattr,B9600);
cfsetospeed(&ttyattr,B9600);
ttyattr.c_iflag = IGNPAR;
//ttyattr.c_cflag = B9600 | HUPCL | CS8 | CREAD | CLOCAL;
ttyattr.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
ttyattr.c_cflag &=~CSIZE;
ttyattr.c_cflag |=CS8;
ttyattr.c_cflag &=~PARENB;
ttyattr.c_cflag &=~INPCK;
ttyattr.c_cflag &=~CSTOPB;
ttyattr.c_cflag |=CLOCAL;
ttyattr.c_cflag |=CREAD;*/
//ttyattr.c_oflag=0;
//ttyattr.c_lflag=0;
ttyattr.c_cc[VMIN] =1;
ttyattr.c_cc[VTIME]=0;
tcflush(fp,TCIFLUSH);
tcflush(fp,TCIOFLUSH);
if(tcsetattr(fp, TCSANOW, &ttyattr)<0)
puts("unable to set comm port");
//short int arr[]={0x0104,0x0000,0x0002,0x71CB};
/*这是发给传感器的命令解析数据0x01040000000271CB;开始我用的是上面的arr,但是我发现一位一位的接收不对,要用一下的储存格式才可以*/
short int arr[]={0x0401,0x0000,0x0200,0xCB71};
int i=0,ret,j;
for(i=0;i<4;i++){
write(fp,arr+i,2);
}
/*当传感器接收到我的命令数据后,会通过串口马上返回一个9字节的十六进制的数据,下面是接收传感器的数据*/
for(j=0;j<9;j++){
while(ret=read(fp,buf+j,1)>0)
{
printf("ret=%d\n",ret);
if(ret==-1){
break;
}
}
printf("%x\n",*buf);
return 0;
}
------解决方案--------------------
你的代码有些乱,貌似不是完整的
while(ret=read(fp,buf+j,1)>0) 这里, = 和 > 2个 操作符 哪个优先级高?
写的代码应该清晰的表达出你的意图, 即使 上面的没错,我同样建议你写成 while((ret=read(fp,buf+j,1))>0)
------解决方案--------------------
1 你确定你的串口正常打开了没有,不要说返回 >0就成功了
2 你确定你发送的数据输送到了传感器?
write(fp,arr+i,2);
这个写法你不觉得有问题吗
3 read返回0 要么就是没有收到数据,