(1)问题1:不知到 请求命令:07 12 41 01 52 f8 03的数据格式
解决:unsigned char 通常定义#define uchar unsigned char
(2)打印unsigned char类型数据
解决: printf( "%02X", (unsigned char)c );
(3)
#include "osc/OscOutboundPacketStream.h"
#include "ip/UdpSocket.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<termios.h>
#include<unistd.h>
#include<errno.h>
#include <sys/un.h>
#include <signal.h>
#include <sys/wait.h>
#include <netdb.h>
#define uchar unsigned char
#define ADDRESS "10.3.4.115"
#define PORT 7000
#define OUTPUT_BUFFER_SIZE 1024
int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
struct termios newtio,oldtio;
if ( tcgetattr( fd,&oldtio) != 0) {
perror("SetupSerial 1");
return -1;
}
bzero( &newtio, sizeof( newtio ) );
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE;
switch( nBits )
{
case 7:
newtio.c_cflag |= CS7;
break;
case 8:
newtio.c_cflag |= CS8;
break;
}
switch( nEvent )
{
case 'O':
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);
break;
case 'E':
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
break;
case 'N':
newtio.c_cflag &= ~PARENB;
break;
}
switch( nSpeed )
{
case 2400:
cfsetispeed(&newtio, B2400);
cfsetospeed(&newtio, B2400);
break;
case 4800:
cfsetispeed(&newtio, B4800);
cfsetospeed(&newtio, B4800);
break;
case 9600:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
case 115200:
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
break;
case 460800:
cfsetispeed(&newtio, B460800);
cfsetospeed(&newtio, B460800);
break;
default:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
}
if( nStop == 1 )
newtio.c_cflag &= ~CSTOPB;
else if ( nStop == 2 )
newtio.c_cflag |= CSTOPB;
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
tcflush(fd,TCIFLUSH);
if((tcsetattr(fd,TCSANOW,&newtio))!=0)
{
perror("com set error");
return -1;
}
// printf("set done!\n\r");
return 0;
}
int main(int argc, char* argv[])
{
(void) argc; // suppress unused parameter warnings
(void) argv; // suppress unused parameter warnings
int fd1,fd0,fd2,fd3,fd4,fd5,fd6,fd7,fd8,fd9,fd10,fd11,nread;
int nset0,nset1,nset2,nset3,nset4,nset5,nset6,nset7,nset8,nset9,nset10,nset11;
char buf[100];
char buf1[1];
uchar buff[512];
bool backstat=false;
int length_s=0;
int length_re=0;
int length_p=0;
int retv=0;
int i=0;
int n=0;
int m=0;
int fd[32];
uchar sbuf[]={0x06,0x32,0x44,0x00,0x8f,0x03};//停止命令
uchar rebuf[]={0x07,0x12,0x41,0x01,0x52,0xf8,0x03};//请求命令
uchar pbuf[]={0x0c,0x22,0x42,0x06,0x93,0x00,0x78,0x01,0xa6,0x00,0xd9,0x03};//防碰撞命令
uchar stopbuf[6]; //停止返回
uchar idbuf[6]; //请求返回
uchar reqbuf[6]; //防碰撞返回
uchar bbuf[512];
length_s=sizeof(sbuf);
length_re=sizeof(rebuf);
length_p=sizeof(pbuf);
memset(stopbuf,0,sizeof(stopbuf));
memset(idbuf,0,sizeof(idbuf));
memset(reqbuf,0,sizeof(reqbuf));
memset(bbuf,0,sizeof(bbuf));
uchar testbuff[512];
memset(testbuff,0,sizeof(testbuff));
memset(buff,0,sizeof(buff));
/*************udp********************/
UdpTransmitSocket transmitSocket( IpEndpointName( ADDRESS, PORT ) );
//char buffer[OUTPUT_BUFFER_SIZE];
//char buffer1[OUTPUT_BUFFER_SIZE];
//char buffer2[OUTPUT_BUFFER_SIZE];
//osc::OutboundPacketStream p0( buffer, OUTPUT_BUFFER_SIZE );
//osc::OutboundPacketStream p1( buffer1, OUTPUT_BUFFER_SIZE );
//osc::OutboundPacketStream p2( buffer2, OUTPUT_BUFFER_SIZE );
/* select函数 */
int rtv;//存放返回值
fd_set rd;//读状态数据集(这个名字不好取,只可意会吧)
struct timeval timeout;//超时设置参数结构体
/***********usb0******************/
/*********Open USB Device*******************/
fd0 = open( "/dev/ttyUSB0", O_RDWR);//打开USB转串口0
if (fd0 == -1)
{
exit(1);
}
else
{
fd[0]=fd0;
}
//else
// {
// retv=write(fd0,sbuf,length_s); /* 接收数据 */
// }
//
// for (i=0;i<retv;i++)
// {
// printf("%02X\n",(uchar)sbuf[i]);
// }
printf("open USB0 success!!\n");
fd1 = open( "/dev/ttyUSB1", O_RDWR);//打开USB转串口1
if (fd1 == -1)
{
exit(1);
}
else
{
fd[1]=fd1;
}
printf("open USB1 success!!\n");
fd2 = open( "/dev/ttyUSB2", O_RDWR);//打开USB转串口2
if (fd2 == -1)
{
exit(1);
}
else
{
fd[2]=fd2;
}
printf("open USB2 success!!\n");
fd3 = open( "/dev/ttyUSB3", O_RDWR);//打开USB转串口3
if (fd3 == -1)
{
exit(1);
}
else
{
fd[3]=fd3;
}
printf("open USB3 success!!\n");
fd4 = open( "/dev/ttyUSB4", O_RDWR);//打开USB转串口4
if (fd4 == -1)
{
exit(1);
}
else
{
fd[4]=fd4;
}
printf("open USB4 success!!\n");
fd5 = open( "/dev/ttyUSB5", O_RDWR);//打开USB转串口5
if (fd5 == -1)
{
exit(1);
}
else
{
fd[5]=fd5;
}
printf("open USB5 success!!\n");
fd6 = open( "/dev/ttyUSB6", O_RDWR);//打开USB转串口6
if (fd6 == -1)
{
exit(1);
}
else
{
fd[6]=fd6;
}
printf("open USB6 success!!\n");
fd7 = open( "/dev/ttyUSB7", O_RDWR);//打开USB转串口7
if (fd7 == -1)
{
exit(1);
}
else
{
fd[7]=fd7;
}
printf("open USB7 success!!\n");
fd8 = open( "/dev/ttyUSB8", O_RDWR);//打开USB转串口8
if (fd8 == -1)
{
exit(1);
}
else
{
fd[8]=fd8;
}
printf("open USB8 success!!\n");
fd9 = open( "/dev/ttyUSB9", O_RDWR);//打开USB转串口4
if (fd9 == -1)
{
exit(1);
}
else
{
fd[9]=fd9;
}
printf("open USB9 success!!\n");
fd10 = open( "/dev/ttyUSB10", O_RDWR);//打开USB转串口5
if (fd10 == -1)
{
exit(1);
}
else
{
fd[10]=fd10;
}
printf("open USB10 success!!\n");
fd11 = open( "/dev/ttyUSB11", O_RDWR);//打开USB转串口5
if (fd11 == -1)
{
exit(1);
}
else
{
fd[11]=fd11;
}
printf("open USB11 success!!\n");
/****************************************************************/
/**********set usb serial*********************/
nset0 = set_opt(fd0, 9600, 8, 'N', 1);//设置usb转串口0
if (nset0 == -1)
exit(1);
printf("SET USB0 success!!");
nset1 = set_opt(fd1, 9600, 8, 'N', 1);//设置usb转串口1
if (nset1 == -1)
exit(1);
printf("SET USB1 success!!");
nset2 = set_opt(fd2, 9600, 8, 'N', 1);//设置usb转串口2
if (nset2 == -1)
exit(1);
printf("SET USB2 success!!");
nset3 = set_opt(fd3, 9600, 8, 'N', 1);//设置usb转串口3
if (nset3 == -1)
exit(1);
printf("SET USB3 success!!");
nset4 = set_opt(fd4, 9600, 8, 'N', 1);//设置usb转串口4
if (nset4 == -1)
exit(1);
printf("SET USB4 success!!");
nset5 = set_opt(fd5, 9600, 8, 'N', 1);//设置usb转串口5
if (nset5 == -1)
exit(1);
printf("SET USB5 success!!");
nset6 = set_opt(fd6, 9600, 8, 'N', 1);//设置usb转串口6
if (nset6 == -1)
exit(1);
printf("SET USB6 success!!");
nset7 = set_opt(fd7, 9600, 8, 'N', 1);//设置usb转串口7
if (nset7 == -1)
exit(1);
printf("SET USB7 success!!");
nset8 = set_opt(fd8, 9600, 8, 'N', 1);//设置usb转串口8
if (nset8 == -1)
exit(1);
printf("SET USB8 success!!");
nset9 = set_opt(fd9, 9600, 8, 'N', 1);//设置usb转串口9
if (nset9 == -1)
exit(1);
printf("SET USB9 success!!");
nset10 = set_opt(fd10, 9600, 8, 'N', 1);//设置usb转串口10
if (nset10 == -1)
exit(1);
printf("SET USB10 success!!");
nset11 = set_opt(fd11, 9600, 8, 'N', 1);//设置usb转串口11
if (nset11 == -1)
exit(1);
printf("SET USB11 success!!");
/****************************************************************/
while(1)
{
for (n=0;n<12;n++)
{
char buffer[OUTPUT_BUFFER_SIZE];
osc::OutboundPacketStream p0( buffer, OUTPUT_BUFFER_SIZE );
retv=write(fd[n],sbuf,length_s); /* 接收数据 */
while(1)
{
printf("I am in the while=%d\n",n);
FD_ZERO(&rd);
FD_SET(fd[n],&rd);
while(FD_ISSET(fd[n],&rd))
{
if(select(fd[n]+1,&rd,NULL,NULL,NULL) < 0)
perror("select error!\n");
else
{
while((nread = read(fd[n],buff,1))>0)
{
//printf("nread = %d\n",nread);
//int j=0;
//printf("data =%02X\n",(uchar)buff[0]); //打印出串口返回的字符
if ((uchar)buff[0]==0x06 || (uchar)buff[0]==0x08 ||(uchar)buff[0]==0x0A)
{
i=0;
bbuf[i]=buff[0];
i=i+1;
}
else if ((uchar)buff[0]==0x03)
{
bbuf[i]=buff[0];
i=i+1;
printf("i=%d\n",i);
int j=0;
//while(j<i){printf("data =%02X",(uchar)bbuf[j++]);} //打印出接收到的返回值
//printf("\n");
//printf("bbuf[5] =%02X\n",(uchar)bbuf[5]);
switch ((uchar)bbuf[0])
{
case 0x06:
{
for(m=0;m<6;m++)
{
printf("recv=%02X\n",(uchar)bbuf[m]);
}
printf("bbuf[2]=%02X\n",bbuf[2]);
if ((uchar)bbuf[2]==0xFE || (uchar)bbuf[2]==0xFF)
{
printf("bbuf[2]=%02X\n",bbuf[2]);
memset(bbuf,0,sizeof(buff));
printf("bbuf[3]=%02X\n",bbuf[2]);
//memset(buffer,0x00,OUTPUT_BUFFER_SIZE);
p0 << osc::BeginBundleImmediate
<< osc::BeginMessage( "/USB1" )
<< (int)bbuf[4] << (int)bbuf[5] << (int)bbuf[6]<< (int)bbuf[7] << osc::EndMessage
<< osc::EndBundle;
transmitSocket.Send( p0.Data(), p0.Size() );
memset(bbuf,0,sizeof(buff));
//memset(buffer,0,OUTPUT_BUFFER_SIZE);
printf("bbuf[4]=%02X\n",bbuf[2]);
backstat=true;
break;
}
printf("ddddddddddddddddd\n");
retv=write(fd[n],rebuf,length_re); /* 发送请求命令 */
break;
}
case 0x08:
{
retv=write(fd[n],pbuf,length_p); /* 发送防碰撞命令 */
//for (i=0;i<retv;i++)
//{
// printf("%02X\n",(uchar)pbuf[i]);
// }
break;
}
case 0x0A:
{
printf("Ready print for ID %02X\n:",(uchar)bbuf[0]);
//memset(buffer,0x00,OUTPUT_BUFFER_SIZE);
p0 << osc::BeginBundleImmediate
<< osc::BeginMessage( "/USB0" )
<< (int)bbuf[4] << (int)bbuf[5] << (int)bbuf[6]<< (int)bbuf[7] << osc::EndMessage
<< osc::EndBundle;
transmitSocket.Send( p0.Data(), p0.Size() );
printf("ID %02X\n:",(uchar)bbuf[0]);
memset(bbuf,0,sizeof(buff));
//memset(buffer,0,OUTPUT_BUFFER_SIZE);
backstat=true;
break;
}
default:
{
printf("getin default");
//memset(buffer,0x00,OUTPUT_BUFFER_SIZE);
p0 << osc::BeginBundleImmediate
<< osc::BeginMessage( "/USBd" )
<< (int)bbuf[4] << (int)bbuf[5] << (int)bbuf[6]<< (int)bbuf[7] << osc::EndMessage
<< osc::EndBundle;
transmitSocket.Send( p0.Data(), p0.Size() );
printf("ID %02X\n:",(uchar)bbuf[0]);
memset(bbuf,0,sizeof(buff));
//memset(buffer,0,OUTPUT_BUFFER_SIZE);
break;
}
}
i=0;
memset(bbuf,0,sizeof(buff));
printf("backstat1111=%d\n:",backstat);
break;
}
else
{
bbuf[i]=buff[0];
i=i+1;
}
}
printf("backstat2222=%d\n:",backstat);
if (backstat)
{
break;
}
}
printf("backstat3333=%d\n:",backstat);
if (backstat)
{
//backstat=false;
break;
}
}
if (backstat)
{
backstat=false;
break;
}
}
printf("n=%d\n",n);
}
}
printf("breakout");
close(fd0);
close(fd1);
close(fd2);
close(fd3);
close(fd4);
close(fd5);
close(fd6);
close(fd7);
close(fd8);
close(fd9);
close(fd10);
close(fd11);
return 0;
}
fflush(stdout)当然是清空stdout的缓冲区了
你可以试试下面的代码
int i;
for (i=0;i<10;i++)
{
printf("%d",i);
// fflush(stdout);
sleep(1);
}
再去掉注释试试就知道了
(4)编程之美
\\ - - //
( @ @ )
--oOOo--(_)--oOOo-------
http://mes-adresses.eu
--------Ooooo-----------
( )
ooooO )
( ) (_/
\ (
\_)
(5)读/写串口是程序不能向下运行串口没有连接设备
(6)osc 所属的p中的缓存无法更新,把p放在while循环里面进行定义