我想通过将串口输入的数据在网页中实时显示出来,但没能顺利实现,请教各位老师。
现状:所使用的硬件为m3C2410,希望通过向串口调试助手写入数据传给m3c2410并显示与对应的网页界面。
调试中现象:从网页向串口发送数据正常,从串口向网页发送命令异常,页面打印信息显示为读取串口失败,即“Read_Port(fd,rbuf,size)=-1”,百思不得其解,望各位老师指点迷津:
有关串口的设置如下:
int Open_Port(int i) //打开串口
{
struct termios options;
if(i==1)
fd1 = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK);
else if(i==2)
fd1 = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NDELAY);
else if(i==3)
fd1 = open("/dev/ttyS2", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd1==-1)
{
return -1;
}
fcntl(fd1, F_SETFL, 0); //fd1是文件句柄,F_SETFL设置文件状态标志和访问模式
bzero(&options,sizeof(options));
tcgetattr(fd1, &options);
cfsetispeed(&options, BAUDRATE);
cfsetospeed(&options, BAUDRATE);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_lflag &= ~(ICANON | ECHO | ECHOE |ISIG);
options.c_cflag &= ~CRTSCTS;
options.c_iflag &= ~(IXON | IXOFF | IXANY); // disable SW Flow Control
options.c_oflag &= ~OPOST;
tcsetattr(fd1, TCSANOW, &options);
return fd1;
}
main() 后面读串口,并在网页中给出提示信息:
Open_Port(1); //打开串口1,好像会影响CGI重定向,所以要多加权限
// Write_Port(Send,2); //发送数据
// Read_Port(rport,25);
// for(j=0; j<3; j++) //等待返回接收
// {
hh = read(fd1, rport,512);
if( hh > 0)
{
printf("Content-type: text/html\n\n");
printf("<html>\n");
printf("<head><title>DateBack</title>\n");
printf("<meta http-equiv=\"refresh\" content=\"5;URL=%s\">",Referer);
printf("</head>\n");
printf("<body>\n");
printf("<br><br><br>");
printf("<hr>");
printf("<div align=\"center\">");
printf("<h1> The lights states </h1>\n");
printf("\nReadWordLenth= %d\n",hh);
printf( "\n Input Words are :%s\n",rport); //字符串输出
printf("<hr>");
printf("<br><br>");
for(i=0;i<hh;i++)
printf( "\n%x\n",rport[i]); //字符串输出
rport[hh+1]= '\0';
printf("<br><br><br>");
printf("</div>");
printf("</body>\n");
printf("</html>\n");
fflush(stdout); //刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。
}
else
{
// Write_Port(Send,2); //发送数据
kk = write(fd1, Send, 2);
printf("Content-type: text/html\n\n");
printf("<html>\n");
printf("<head><title>DateError!</title>\n");
printf("<meta http-equiv=\"refresh\" content=\"5;URL=%s\">",Referer);
printf("</head>\n");
printf("<body>\n");
printf("<br><br><br>");
printf("<div align=\"center\">");
printf("<h2>Read Serial port Failure数据读取失败!</h2>\n");
printf("\nRead Serial Data State = %d\n\r",hh);
printf("<br>");
printf("\nWrite Serial Data State = %d\n",kk);
printf("<hr>");
printf("</div>");
printf("</body>\n");
printf("</html>\n");
}
fcntl(fd1, F_SETFL, FNDELAY);//FNDELAY选项将导致当端口上没有字符可读时,read函数返回0,
Close_Port();
调试结果:
Read Serial port Failure数据读取失败!
nRead Serial Data State = -1