文件:
a.php b.php
aTest.php
a.php:
b.php
<?php
class b
{ protected $a = 0;
protected $b = 0;
public function __construct($a,$b)
{
$this->a = $a;
$this->b = $b;
echo $this->b;
}
public function need_mock($a)
{
$b = $this->a+$a;
return $b;
}
}
?>
aTest.php
a.php b.php
aTest.php
a.php:
<?php
class a
{
private $inHandle;
public function getHandle($handle='')
{
if ('' != $handle)
{
$this->inHandle = $handle;
return ;
}
elseif ('' != $this->inHandle)
{
return;
}
$this->inHandle = new b();
return;
}
public function use_b_class($num)
{ //调用b类的:need_mock方法,假如是外部资源,为此需要mock
$value = $this->inHandle->need_mock($num);
$result = $value;
return $result;
}
}
?>
class a
{
private $inHandle;
public function getHandle($handle='')
{
if ('' != $handle)
{
$this->inHandle = $handle;
return ;
}
elseif ('' != $this->inHandle)
{
return;
}
$this->inHandle = new b();
return;
}
public function use_b_class($num)
{ //调用b类的:need_mock方法,假如是外部资源,为此需要mock
$value = $this->inHandle->need_mock($num);
$result = $value;
return $result;
}
}
?>
b.php
<?php
class b
{ protected $a = 0;
protected $b = 0;
public function __construct($a,$b)
{
$this->a = $a;
$this->b = $b;
echo $this->b;
}
public function need_mock($a)
{
$b = $this->a+$a;
return $b;
}
}
?>
aTest.php
<?php
require_once 'a.php';
require_once 'b.php';
require_once 'PHPUnit/Framework/TestCase.php';
/**
* a test case.
*/
class aTest extends PHPUnit_Framework_TestCase {
/**
* @var a
*/
private $a;
/**
* Prepares the environment before running a test.
*/
protected function setUp() {
parent::setUp ();
// TODO Auto-generated aTest::setUp()
$this->a = new a(/* parameters */);
}
/**
* Cleans up the environment after running a test.
*/
protected function tearDown() {
// TODO Auto-generated aTest::tearDown()
$this->a = null;
parent::tearDown ();
}
/**
* Constructs the test case.
*/
public function __construct() {
// TODO Auto-generated constructor
}
/**
* Tests a->getHandle()
*/
public function testGetHandle() {
// TODO Auto-generated aTest->testGetHandle()
$this->markTestIncomplete ( "getHandle test not implemented" );
$this->a->getHandle(/* parameters */);
}
/**
* Tests a->use_b_class()
*/
public function testUse_b_class() {
// TODO Auto-generated aTest->testUse_b_class()
//$this->markTestIncomplete ( "use_b_class test not implemented" );
//$this->a->use_b_class(/* parameters */);
$a = array(1,"第二个参数");//注意:必须传array(构造函数参数1,构造函数参数2,构造函数参数3)
$stub = $this->getMock('b', array('need_mock'),$a);
$stub->expects($this->any())
->method('need_mock')
->with(
$this->equalTo( 1 )//传入一个参数
)
->will($this->returnValue(11));//设定返回为11
$this->a->getHandle($stub);//传入经过mock的对象
echo $this->a->use_b_class(1);
$this->assertEquals($this->a->use_b_class(1) , 11 );
$this->assertEquals(array(array(0,1,2)),array(array(0,1,2)));//必须是所谓的二维数组,否则出错
}
}
require_once 'a.php';
require_once 'b.php';
require_once 'PHPUnit/Framework/TestCase.php';
/**
* a test case.
*/
class aTest extends PHPUnit_Framework_TestCase {
/**
* @var a
*/
private $a;
/**
* Prepares the environment before running a test.
*/
protected function setUp() {
parent::setUp ();
// TODO Auto-generated aTest::setUp()
$this->a = new a(/* parameters */);
}
/**
* Cleans up the environment after running a test.
*/
protected function tearDown() {
// TODO Auto-generated aTest::tearDown()
$this->a = null;
parent::tearDown ();
}
/**
* Constructs the test case.
*/
public function __construct() {
// TODO Auto-generated constructor
}
/**
* Tests a->getHandle()
*/
public function testGetHandle() {
// TODO Auto-generated aTest->testGetHandle()
$this->markTestIncomplete ( "getHandle test not implemented" );
$this->a->getHandle(/* parameters */);
}
/**
* Tests a->use_b_class()
*/
public function testUse_b_class() {
// TODO Auto-generated aTest->testUse_b_class()
//$this->markTestIncomplete ( "use_b_class test not implemented" );
//$this->a->use_b_class(/* parameters */);
$a = array(1,"第二个参数");//注意:必须传array(构造函数参数1,构造函数参数2,构造函数参数3)
$stub = $this->getMock('b', array('need_mock'),$a);
$stub->expects($this->any())
->method('need_mock')
->with(
$this->equalTo( 1 )//传入一个参数
)
->will($this->returnValue(11));//设定返回为11
$this->a->getHandle($stub);//传入经过mock的对象
echo $this->a->use_b_class(1);
$this->assertEquals($this->a->use_b_class(1) , 11 );
$this->assertEquals(array(array(0,1,2)),array(array(0,1,2)));//必须是所谓的二维数组,否则出错
}
}
听传说是中科院研究出鸡饲料,现在开始研究人了:
0~~5岁,
女人:妈妈.
男人:妈妈.
6~~10岁:
女人:不是讨厌的男孩就行.
男人:能和我一起欺负其它人的男孩.
11~~15岁:
女人:十六七八九岁的大男孩,只要不是本班的那一帮就行.
男人:篮球,足球,乒乓球,网球......
16~~25岁:
女人:26岁至29岁的有事业基础,有品位,有才华的男人.
男人:20岁至24岁的漂亮,有身段的女人.
25~~30岁:
女人:坚持要比自己大的男人.
男人:20岁至24岁的漂亮,有身段的女人
30~~40岁:
女人:心灵契合的男人.
男人:20岁至24岁的漂亮,有身段的女人
40~~50岁:
女人:男人.
男人:20岁至24岁的漂亮,有身段的女人
50~~60岁:
女人:能和她终老的男人.
男人:20岁至24岁的漂亮,有身段的女人.
60~~70岁:
女人:和他在一起,需要自己照顾的男人,
男人:20岁至24岁的漂亮,有身段的女人.
70~~80岁:
女人:和他在一起,不需要自己照顾的男人
男人:20岁至24岁的漂亮,有身段的女人.
80~~90岁:
女人:死在自己后面的男人.
男人:我虽然已经老眼昏花.不过我还是希望20岁至24岁的漂亮,有身段的女人.
结论:男人是专一的
0~~5岁,
女人:妈妈.
男人:妈妈.
6~~10岁:
女人:不是讨厌的男孩就行.
男人:能和我一起欺负其它人的男孩.
11~~15岁:
女人:十六七八九岁的大男孩,只要不是本班的那一帮就行.
男人:篮球,足球,乒乓球,网球......
16~~25岁:
女人:26岁至29岁的有事业基础,有品位,有才华的男人.
男人:20岁至24岁的漂亮,有身段的女人.
25~~30岁:
女人:坚持要比自己大的男人.
男人:20岁至24岁的漂亮,有身段的女人
30~~40岁:
女人:心灵契合的男人.
男人:20岁至24岁的漂亮,有身段的女人
40~~50岁:
女人:男人.
男人:20岁至24岁的漂亮,有身段的女人
50~~60岁:
女人:能和她终老的男人.
男人:20岁至24岁的漂亮,有身段的女人.
60~~70岁:
女人:和他在一起,需要自己照顾的男人,
男人:20岁至24岁的漂亮,有身段的女人.
70~~80岁:
女人:和他在一起,不需要自己照顾的男人
男人:20岁至24岁的漂亮,有身段的女人.
80~~90岁:
女人:死在自己后面的男人.
男人:我虽然已经老眼昏花.不过我还是希望20岁至24岁的漂亮,有身段的女人.
结论:男人是专一的
〖解释〗仁者见它说是仁,智者见它说是智。比喻对同一个问题,不同的人从不同的立场或角度有不同的看法。
〖出处〗《周易·系辞上》:“仁者见之谓之仁,智者见之谓之智。”
〖示例〗俗话说:~,所以我们对这些人的看法应该理解。
【原文】
一阴一阳之谓道。继之者善也,成之者性也。仁者见之谓之仁,知者见之谓之知。百姓日用而不知,故君子之道鲜矣①。显诸仁,藏诸用,鼓万物而不与圣人同忧,盛德大业至矣哉!富有之谓大业。日新之谓盛德。生生之谓易②。成象之谓乾。效法之谓坤。极数知来之谓占③。通变之谓事。阴阳不测之谓神。
【注释】
①鲜:少,这里指很少有人了解。②日新:不断更新。生生:变化不止.③极数:穷尽卦、交的变化。
【译文】
阴阳的交替变化就叫做道。相继不断就是善,成就万物的是性。仁者从自己的角度看,把它叫做仁;智者从自己的角度看,把它叫做智。平民百姓每天接触阴阳之道而不懂得,因此君子之道就很少有人知道了。它表现出来就是仁,隐藏起来就是用,鼓动万物,不与圣人共同劳神忧虑,它的崇高品德和伟大业绩达到了顶点。拥有万物就叫伟大业绩。不断更新就叫崇高品德。变化不止就叫易。生成物象就叫乾。仿效乾而完成物象就叫坤。穷尽卦支而预知未来就叫占问。承接更新就叫事。阴阳交替不可把握就叫神奇。
【读解】
《系辞》的作者在这一节里阐发自己对“道”的看法,认为宇宙万物产生的根源在于“道”,即阴与阳的交替变化。道的变化是 无穷无尽的,道也无所不在,却难以把握,只有圣人君子才能完全领悟。
这些抽象的议论都在表达一种宇宙观,一种哲学思想,难怪晋通百姓不大搞得清楚。不过,如果不要说得那么高深,”百姓还是可以懂的。比如生命,来自于雌、雄的结合。比如花朵,生于阳光和土壤。比如时光,由白天和黑夜构成。这就是阴阳交替结合产生万物。
阴阳观具有中国特色,深入咱们心里,我们自古以来就用它看待和解释世界上的万事万物。
阅读全文
〖出处〗《周易·系辞上》:“仁者见之谓之仁,智者见之谓之智。”
〖示例〗俗话说:~,所以我们对这些人的看法应该理解。
【原文】
一阴一阳之谓道。继之者善也,成之者性也。仁者见之谓之仁,知者见之谓之知。百姓日用而不知,故君子之道鲜矣①。显诸仁,藏诸用,鼓万物而不与圣人同忧,盛德大业至矣哉!富有之谓大业。日新之谓盛德。生生之谓易②。成象之谓乾。效法之谓坤。极数知来之谓占③。通变之谓事。阴阳不测之谓神。
【注释】
①鲜:少,这里指很少有人了解。②日新:不断更新。生生:变化不止.③极数:穷尽卦、交的变化。
【译文】
阴阳的交替变化就叫做道。相继不断就是善,成就万物的是性。仁者从自己的角度看,把它叫做仁;智者从自己的角度看,把它叫做智。平民百姓每天接触阴阳之道而不懂得,因此君子之道就很少有人知道了。它表现出来就是仁,隐藏起来就是用,鼓动万物,不与圣人共同劳神忧虑,它的崇高品德和伟大业绩达到了顶点。拥有万物就叫伟大业绩。不断更新就叫崇高品德。变化不止就叫易。生成物象就叫乾。仿效乾而完成物象就叫坤。穷尽卦支而预知未来就叫占问。承接更新就叫事。阴阳交替不可把握就叫神奇。
【读解】
《系辞》的作者在这一节里阐发自己对“道”的看法,认为宇宙万物产生的根源在于“道”,即阴与阳的交替变化。道的变化是 无穷无尽的,道也无所不在,却难以把握,只有圣人君子才能完全领悟。
这些抽象的议论都在表达一种宇宙观,一种哲学思想,难怪晋通百姓不大搞得清楚。不过,如果不要说得那么高深,”百姓还是可以懂的。比如生命,来自于雌、雄的结合。比如花朵,生于阳光和土壤。比如时光,由白天和黑夜构成。这就是阴阳交替结合产生万物。
阴阳观具有中国特色,深入咱们心里,我们自古以来就用它看待和解释世界上的万事万物。

程序:
1 接收程序
2 发送程序
1 接收程序
#include<REG51.h>
void init(void)
{
TMOD=0x20;
TH1=0xE8;
TL1=0xE8;
PCON=0x00;
TR1=1;
SCON=0x50;
}
void checkout(unsigned int para)
{ unsigned int paracheck=para;
redo: if(SBUF!=paracheck)
SBUF=0xFF;
while(TI==0);
TI=0;
while(RI==0);
RI=0;
if(SBUF!=paracheck)
goto redo;
else SBUF=0xBB;
while(TI==0);
TI=0;
}
void ledflash(unsigned char flashnum)
{
unsigned char i,k;
for(i=flashnum;i>0;i--)
for(k=200;k>0;k--)
{
;
P0=0x00;
P0=0xFF;
}
}
void get()
{ unsigned int getnum;
while(RI==0);
RI=0;
while((getnum=SBUF)!=0xCC)
{
if(getnum%4==0)
{ledflash(getnum);
SBUF=0xBB;
goto check;}
else
SBUF=0xFF;
check: while(TI==0);
TI=0;
while(RI==0);
RI=0;
}
}
void ledon()
{
P0=0x00;
P0=0xFF;
}
void ledoff()
{
P0=0xFF;
P0=0x00;
}
void main(void)
{
while(1)
{
init();
checkout(0xAA);
ledon();
get();
checkout(0xCC);
ledoff();
}
}
void init(void)
{
TMOD=0x20;
TH1=0xE8;
TL1=0xE8;
PCON=0x00;
TR1=1;
SCON=0x50;
}
void checkout(unsigned int para)
{ unsigned int paracheck=para;
redo: if(SBUF!=paracheck)
SBUF=0xFF;
while(TI==0);
TI=0;
while(RI==0);
RI=0;
if(SBUF!=paracheck)
goto redo;
else SBUF=0xBB;
while(TI==0);
TI=0;
}
void ledflash(unsigned char flashnum)
{
unsigned char i,k;
for(i=flashnum;i>0;i--)
for(k=200;k>0;k--)
{
;
P0=0x00;
P0=0xFF;
}
}
void get()
{ unsigned int getnum;
while(RI==0);
RI=0;
while((getnum=SBUF)!=0xCC)
{
if(getnum%4==0)
{ledflash(getnum);
SBUF=0xBB;
goto check;}
else
SBUF=0xFF;
check: while(TI==0);
TI=0;
while(RI==0);
RI=0;
}
}
void ledon()
{
P0=0x00;
P0=0xFF;
}
void ledoff()
{
P0=0xFF;
P0=0x00;
}
void main(void)
{
while(1)
{
init();
checkout(0xAA);
ledon();
get();
checkout(0xCC);
ledoff();
}
}
2 发送程序
#include<REG51.h>
void init(void)
{
TMOD=0x20;
TH1=0xE8;
TL1=0xE8;
PCON=0x00;
TR1=1;
SCON=0x50;
}
void checkout(unsigned int para)
{ unsigned int paracheck;
paracheck=para;
redo: SBUF=paracheck;
while(TI==0);
TI=0;
while(RI==0);
RI=0;
if(SBUF!=0xBB)
goto redo;
}
void sent(void)
{unsigned char i;
checkout(0xAA);
for( i=0;i<20;i++)
{
if(i%4==0)
checkout(i);
}
checkout(0xCC);
}
void ledon(void)
{
P0=0x00;
P0=0xFF;
}
void ledoff(void)
{
P0=0x00;
}
void main()
{
while(1)
{
init();
ledon();
sent();
ledoff();
};
}
void init(void)
{
TMOD=0x20;
TH1=0xE8;
TL1=0xE8;
PCON=0x00;
TR1=1;
SCON=0x50;
}
void checkout(unsigned int para)
{ unsigned int paracheck;
paracheck=para;
redo: SBUF=paracheck;
while(TI==0);
TI=0;
while(RI==0);
RI=0;
if(SBUF!=0xBB)
goto redo;
}
void sent(void)
{unsigned char i;
checkout(0xAA);
for( i=0;i<20;i++)
{
if(i%4==0)
checkout(i);
}
checkout(0xCC);
}
void ledon(void)
{
P0=0x00;
P0=0xFF;
}
void ledoff(void)
{
P0=0x00;
}
void main()
{
while(1)
{
init();
ledon();
sent();
ledoff();
};
}
int openport(char *Dev) //打开串口
int setport(int fd, int baud,int databits,int stopbits,int parity)//设置串口,波特率,数据位,停止位,校验
int readport(int fd,char *buf,int len,int maxwaittime)//读数据,参数为串口,BUF,长度,超时时间
int writeport(int fd,char *buf,int len) //发送数据
void clearport(int fd) //如果出现数据与规约不符合,可以调用这个函数来刷新串口读写数据
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <sys/time.h>
int openport(char *Dev)
{
int fd = open( Dev, O_RDWR|O_NOCTTY|O_NDELAY );
if (-1 == fd)
{
perror("Can''t Open Serial Port");
return -1;
}
else
return fd;
}
int setport(int fd, int baud,int databits,int stopbits,int parity)
{
int baudrate;
struct termios newtio;
switch(baud)
{
case 300:
baudrate=B300;
break;
case 600:
baudrate=B600;
break;
case 1200:
baudrate=B1200;
break;
case 2400:
baudrate=B2400;
break;
case 4800:
baudrate=B4800;
break;
case 9600:
baudrate=B9600;
break;
case 19200:
baudrate=B19200;
break;
case 38400:
baudrate=B38400;
break;
default :
baudrate=B9600;
break;
}
tcgetattr(fd,&newtio);
bzero(&newtio,sizeof(newtio));
//setting c_cflag
newtio.c_cflag &=~CSIZE;
switch (databits) /*设置数据位数*/
{
case 7:
newtio.c_cflag |= CS7; //7位数据位
break;
case 8:
newtio.c_cflag |= CS8; //8位数据位
break;
default:
newtio.c_cflag |= CS8;
break;
}
switch (parity) //设置校验
{
case 'n':
case 'N':
newtio.c_cflag &= ~PARENB; /* Clear parity enable */
newtio.c_iflag &= ~INPCK; /* Enable parity checking */
break;
case 'o':
case 'O':
newtio.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
newtio.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'e':
case 'E':
newtio.c_cflag |= PARENB; /* Enable parity */
newtio.c_cflag &= ~PARODD; /* 转换为偶效验*/
newtio.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'S':
case 's': /*as no parity*/
newtio.c_cflag &= ~PARENB;
newtio.c_cflag &= ~CSTOPB;break;
default:
newtio.c_cflag &= ~PARENB; /* Clear parity enable */
newtio.c_iflag &= ~INPCK; /* Enable parity checking */
break;
}
switch (stopbits)//设置停止位
{
case 1:
newtio.c_cflag &= ~CSTOPB; //1
break;
case 2:
newtio.c_cflag |= CSTOPB; //2
break;
default:
newtio.c_cflag &= ~CSTOPB;
break;
}
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
newtio.c_cflag |= (CLOCAL|CREAD);
newtio.c_oflag|=OPOST;
newtio.c_iflag &=~(IXON|IXOFF|IXANY);
cfsetispeed(&newtio,baudrate);
cfsetospeed(&newtio,baudrate);
tcflush(fd, TCIFLUSH);
if (tcsetattr(fd,TCSANOW,&newtio) != 0)
{
perror("SetupSerial 3");
return -1;
}
return 0;
}
int readport(int fd,char *buf,int len,int maxwaittime)//读数据,参数为串口,BUF,长度,超时时间
{
int no="0";int rc;int rcnum="len";
struct timeval tv;
fd_set readfd;
tv.tv_sec=maxwaittime/1000; //SECOND
tv.tv_usec=maxwaittime%1000*1000; //USECOND
FD_ZERO(&readfd);
FD_SET(fd,&readfd);
rc=select(fd+1,&readfd,NULL,NULL,&tv);
if(rc>0)
{
while(len)
{
rc=read(fd,&buf[no],1);
if(rc>0)
no=no+1;
len=len-1;
}
if(no!=rcnum)
return -1; //如果收到的长度与期望长度不一样,返回-1
return rcnum; //收到长度与期望长度一样,返回长度
}
else
{
return -1;
}
return -1;
}
int writeport(int fd,char *buf,int len) //发送数据
{
write(fd,buf,len);
}
void clearport(int fd) //如果出现数据与规约不符合,可以调用这个函数来刷新串口读写数据
{
tcflush(fd,TCIOFLUSH);
}
main()
{
int fd,rc,i,ret;
unsigned char rbuf[256];
unsigned char wbuf[256]="";
for(i=0;i<256;i++)
wbuf[i]=i;
char *dev ="/dev/ttyS0"; //串口号 /dev/ttyS0 对应于串口1
fd = openport(dev); //打开串口
if(fd>0)
{
ret=setport(fd,4800,8,1,'o'); //设置串口,波特率,数据位,停止位,校验
if(ret<0)
{
printf("Can't Set Serial Port!\n");
exit(0);
}
}
else
{
printf("Can't Open Serial Port!\n");
exit(0);
}
while(1){
rc=readport(fd,rbuf,5,500); //读取5个字节,超时时间为500毫秒
if(rc>0)
{
writeport(fd,wbuf,rc);
printf("recv:%d\n",rc);
for(i=0;i<rc;i++)
printf("%02x ",rbuf[i]);
printf("\n");
}
else
printf("recv none\n");
}
close(fd);
}
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <sys/time.h>
int openport(char *Dev)
{
int fd = open( Dev, O_RDWR|O_NOCTTY|O_NDELAY );
if (-1 == fd)
{
perror("Can''t Open Serial Port");
return -1;
}
else
return fd;
}
int setport(int fd, int baud,int databits,int stopbits,int parity)
{
int baudrate;
struct termios newtio;
switch(baud)
{
case 300:
baudrate=B300;
break;
case 600:
baudrate=B600;
break;
case 1200:
baudrate=B1200;
break;
case 2400:
baudrate=B2400;
break;
case 4800:
baudrate=B4800;
break;
case 9600:
baudrate=B9600;
break;
case 19200:
baudrate=B19200;
break;
case 38400:
baudrate=B38400;
break;
default :
baudrate=B9600;
break;
}
tcgetattr(fd,&newtio);
bzero(&newtio,sizeof(newtio));
//setting c_cflag
newtio.c_cflag &=~CSIZE;
switch (databits) /*设置数据位数*/
{
case 7:
newtio.c_cflag |= CS7; //7位数据位
break;
case 8:
newtio.c_cflag |= CS8; //8位数据位
break;
default:
newtio.c_cflag |= CS8;
break;
}
switch (parity) //设置校验
{
case 'n':
case 'N':
newtio.c_cflag &= ~PARENB; /* Clear parity enable */
newtio.c_iflag &= ~INPCK; /* Enable parity checking */
break;
case 'o':
case 'O':
newtio.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
newtio.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'e':
case 'E':
newtio.c_cflag |= PARENB; /* Enable parity */
newtio.c_cflag &= ~PARODD; /* 转换为偶效验*/
newtio.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'S':
case 's': /*as no parity*/
newtio.c_cflag &= ~PARENB;
newtio.c_cflag &= ~CSTOPB;break;
default:
newtio.c_cflag &= ~PARENB; /* Clear parity enable */
newtio.c_iflag &= ~INPCK; /* Enable parity checking */
break;
}
switch (stopbits)//设置停止位
{
case 1:
newtio.c_cflag &= ~CSTOPB; //1
break;
case 2:
newtio.c_cflag |= CSTOPB; //2
break;
default:
newtio.c_cflag &= ~CSTOPB;
break;
}
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
newtio.c_cflag |= (CLOCAL|CREAD);
newtio.c_oflag|=OPOST;
newtio.c_iflag &=~(IXON|IXOFF|IXANY);
cfsetispeed(&newtio,baudrate);
cfsetospeed(&newtio,baudrate);
tcflush(fd, TCIFLUSH);
if (tcsetattr(fd,TCSANOW,&newtio) != 0)
{
perror("SetupSerial 3");
return -1;
}
return 0;
}
int readport(int fd,char *buf,int len,int maxwaittime)//读数据,参数为串口,BUF,长度,超时时间
{
int no="0";int rc;int rcnum="len";
struct timeval tv;
fd_set readfd;
tv.tv_sec=maxwaittime/1000; //SECOND
tv.tv_usec=maxwaittime%1000*1000; //USECOND
FD_ZERO(&readfd);
FD_SET(fd,&readfd);
rc=select(fd+1,&readfd,NULL,NULL,&tv);
if(rc>0)
{
while(len)
{
rc=read(fd,&buf[no],1);
if(rc>0)
no=no+1;
len=len-1;
}
if(no!=rcnum)
return -1; //如果收到的长度与期望长度不一样,返回-1
return rcnum; //收到长度与期望长度一样,返回长度
}
else
{
return -1;
}
return -1;
}
int writeport(int fd,char *buf,int len) //发送数据
{
write(fd,buf,len);
}
void clearport(int fd) //如果出现数据与规约不符合,可以调用这个函数来刷新串口读写数据
{
tcflush(fd,TCIOFLUSH);
}
main()
{
int fd,rc,i,ret;
unsigned char rbuf[256];
unsigned char wbuf[256]="";
for(i=0;i<256;i++)
wbuf[i]=i;
char *dev ="/dev/ttyS0"; //串口号 /dev/ttyS0 对应于串口1
fd = openport(dev); //打开串口
if(fd>0)
{
ret=setport(fd,4800,8,1,'o'); //设置串口,波特率,数据位,停止位,校验
if(ret<0)
{
printf("Can't Set Serial Port!\n");
exit(0);
}
}
else
{
printf("Can't Open Serial Port!\n");
exit(0);
}
while(1){
rc=readport(fd,rbuf,5,500); //读取5个字节,超时时间为500毫秒
if(rc>0)
{
writeport(fd,wbuf,rc);
printf("recv:%d\n",rc);
for(i=0;i<rc;i++)
printf("%02x ",rbuf[i]);
printf("\n");
}
else
printf("recv none\n");
}
close(fd);
}
今天说下利用VB如何进行串口读写。
首先需要的是在VB中增加一个microsoft comm control 6.0的控件。步骤就是:工程->部件->点击microsoft comm control 6.0->确定。
先介绍一下必须熟悉几个属性:
CommPort 设置并返回通讯端口号。
Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。
Input 从接收缓冲区返回和删除字符。
Output 向传输缓冲区写一个字符串。
然后利用给大家一个读串口的小例程:
Private Sub Form_Load()
Mcom.CommPort = 1 '选择com1
Mcom.Settings = "115200,N,8,1" '设置波特率为115.2kpbs,没有奇偶校验,8位数据位,1位结束位
Mcom.InputLen = 0 '读取全部的输入缓冲区
If Mcom.PortOpen = False Then Mcom.PortOpen = True '端口打开
Mcom.RThreshold = 2
Mcom.SThreshold = 2
End Sub
Private Sub Mcom_OnComm() '所有的通讯事件都可以激发MSComm1控件的OnComm事件
Select Case Mcom.CommEvent
Case comEvReceive'此处的代码可以进行当串口的接受缓冲区里有RThreshold个字符的处理
Text4 = Text4 & Mcom.Input
Case comEvSend'此处的代码可以进行当串口的发送缓冲区里有SThreshold个字符的处理
End Select
End Sub
Private Sub Form_Unload(Cancel As Integer)
If Mcom.PortOpen = True Then Mcom.PortOpen = False
End Sub
利用上面的小程序,我们就可以通过读到外设给串口发出的数据了。
如果要发数据到串口就更简单了:
Private Sub SendC_Click()
Dim sendbuff as string
sendbuff = Text3
Mcom.Output = sendbuff
End Sub
这样就可以将Text3中的数据发送到串口了。这就是一个最简单的串口读写例程了,操作的过程就是:初始化串口(端口、波特率等)->打开端口->利用接收buff读上传数据+发送buff写下传数据->完毕后关闭串口。
因为我也是最近在学习这个串口的读写,还没有深入下去。希望这个小例程能够帮到那些想要学习串口读写的人。
首先需要的是在VB中增加一个microsoft comm control 6.0的控件。步骤就是:工程->部件->点击microsoft comm control 6.0->确定。
先介绍一下必须熟悉几个属性:
CommPort 设置并返回通讯端口号。
Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。
Input 从接收缓冲区返回和删除字符。
Output 向传输缓冲区写一个字符串。
然后利用给大家一个读串口的小例程:
Private Sub Form_Load()
Mcom.CommPort = 1 '选择com1
Mcom.Settings = "115200,N,8,1" '设置波特率为115.2kpbs,没有奇偶校验,8位数据位,1位结束位
Mcom.InputLen = 0 '读取全部的输入缓冲区
If Mcom.PortOpen = False Then Mcom.PortOpen = True '端口打开
Mcom.RThreshold = 2
Mcom.SThreshold = 2
End Sub
Private Sub Mcom_OnComm() '所有的通讯事件都可以激发MSComm1控件的OnComm事件
Select Case Mcom.CommEvent
Case comEvReceive'此处的代码可以进行当串口的接受缓冲区里有RThreshold个字符的处理
Text4 = Text4 & Mcom.Input
Case comEvSend'此处的代码可以进行当串口的发送缓冲区里有SThreshold个字符的处理
End Select
End Sub
Private Sub Form_Unload(Cancel As Integer)
If Mcom.PortOpen = True Then Mcom.PortOpen = False
End Sub
利用上面的小程序,我们就可以通过读到外设给串口发出的数据了。
如果要发数据到串口就更简单了:
Private Sub SendC_Click()
Dim sendbuff as string
sendbuff = Text3
Mcom.Output = sendbuff
End Sub
这样就可以将Text3中的数据发送到串口了。这就是一个最简单的串口读写例程了,操作的过程就是:初始化串口(端口、波特率等)->打开端口->利用接收buff读上传数据+发送buff写下传数据->完毕后关闭串口。
因为我也是最近在学习这个串口的读写,还没有深入下去。希望这个小例程能够帮到那些想要学习串口读写的人。
笔记本电脑没有COM口(现在的笔记本都是没有COM口的),以前用的电脑属于老款式的,自带COM口,不需要考虑连接问题,这下如何连接笔记本和PLC成了难题。
正在发愁的时候想到以前曾经听说过有种USB转COM的工具,马上去电子市场询问,那里的老板给我介绍了一个,很简单的东西,一头带个USB借口,另一头是个COM口,价格也不贵,花35元搞定。拿回来就着急着用,按部就班,装驱动,连线,一切准备就绪后就开始通讯,问题出现了,通讯失败!换了其他的 COM口,都失败(WINC软件有1-4个COM口),该不会是买了个坏的吧?
琢磨了一下,马上意识到电脑本身的串口问题,于是打开设备管理器查看COM口,问题果然在那里,这台电脑的COM1,COM3,COM4全部被占用,在安装USB转COM的工具时它默认了COM5口,所以导致通讯不了,通过‘高级’修改COM5为COM2,然后设置PLC软件端口为COM2,通讯成功!
有这个工具后,我们现在的串口通讯线也可以连接没有串口的电脑,不需要重新购买通讯电缆了!一点经历,希望给新手点帮助!
正在发愁的时候想到以前曾经听说过有种USB转COM的工具,马上去电子市场询问,那里的老板给我介绍了一个,很简单的东西,一头带个USB借口,另一头是个COM口,价格也不贵,花35元搞定。拿回来就着急着用,按部就班,装驱动,连线,一切准备就绪后就开始通讯,问题出现了,通讯失败!换了其他的 COM口,都失败(WINC软件有1-4个COM口),该不会是买了个坏的吧?
琢磨了一下,马上意识到电脑本身的串口问题,于是打开设备管理器查看COM口,问题果然在那里,这台电脑的COM1,COM3,COM4全部被占用,在安装USB转COM的工具时它默认了COM5口,所以导致通讯不了,通过‘高级’修改COM5为COM2,然后设置PLC软件端口为COM2,通讯成功!
有这个工具后,我们现在的串口通讯线也可以连接没有串口的电脑,不需要重新购买通讯电缆了!一点经历,希望给新手点帮助!
PHP 5.2.6 (cli) (built: May 2 2008 18:02:07),扩展了一个:extension=php_dio.dll
可以通过:mode com1 来查询com1的情况!
exec() 這個 PHP 函式執行 mode 外部指令,用來設定 com port 相關資訊,以範例來說是設定傳輸速率=19200、資料位元=8、停止位元=1、同位檢查=無,這要視設備而定,設定正確才能做存取動作。
_____________________________________Server端_______________________________
_____________________________________client端_______________________________
注意:在window下com是当作一个文件打开的,只能有一个进程控制,可能导致clien 或者 server 出现:Warning: dio_open(): cannot open file COM1: with flags 2 and permissions 0: Permission denied in ****
可以通过:mode com1 来查询com1的情况!
exec() 這個 PHP 函式執行 mode 外部指令,用來設定 com port 相關資訊,以範例來說是設定傳輸速率=19200、資料位元=8、停止位元=1、同位檢查=無,這要視設備而定,設定正確才能做存取動作。
_____________________________________Server端_______________________________
<?php
// --------------------------------------------------------------------------
// File name : RS232_Server.php
// Description : RS232演示上位机程序
// Requirement : PHP 5.1.4 (cli) (http://www.php.net)
//
// Copyright(C), HonestQiao, 2006, All Rights Reserved.
//
// Author: HonestQiao (honestqiao@hotmail.com/QQ:5601680)
//
// 程序简介:
// 本程序与RS232_Client构成一个完整的演示系统,展示了PHP在RS232串口通讯上的应用。
// 程序之中实现了一个基础但是完整的RS232通讯协议(HQB232),通讯协议格式如下:
// 协议内容:
// C->S 01 //请求通讯
// S->C 02 //响应通讯
// C->S LEN DATA //LEN表示数据(DATA)长度 DATA表示实际数据
// C->S 03 //结束通讯
// 说明:S表示上位机 C表示下位机
// HQB232表示HonestQiao演示的基础(Base)RS232通讯协议,包含了协议的
// 请求和响应,数据帧的结构。
// 演示过程为通讯的请求和响应,十次数据帧的发送, 通讯的结束
// 数据帧的结构为当前的序号,microtime(),随机字符串
//
// 欢迎探讨PHP在RS232串口通讯上的应用。
// --------------------------------------------------------------------------
set_time_limit(0);
exec('mode COM1: baud=9600 data=8 stop=1 parity=n xon=on');
$fd = dio_open('COM1:', O_RDWR);
if(!$fd)
{
die("Error when open COM1");
}
$ff = dio_stat($fd);print_r($ff);
echo "HQB232 SERVER is listenning on COM1\n";
/// read
$len = 2;
$t=0;while (($t++)<1000)
{
$data = dio_read($fd, $len);
if ($data) {
if($data==chr(0).chr(1)){
echo "S_RECV:01\n";
echo "S_SEND:02\n";
dio_write($fd,chr(0).chr(2));
break;
}
}
}
/// read
$len = 2;
$t=0;while (($t++)<1000)
{
$len = 2;
$data = dio_read($fd, $len);
if($data==chr(0).chr(3)){
echo "S_RECV:03\n";
break;
}
elseif ($data) {
$len = intval($data);
$data = dio_read($fd, $len);
if($data){
echo "S_RECV:($len)$data\n";
}
}
}
dio_close($fd);
?>
// --------------------------------------------------------------------------
// File name : RS232_Server.php
// Description : RS232演示上位机程序
// Requirement : PHP 5.1.4 (cli) (http://www.php.net)
//
// Copyright(C), HonestQiao, 2006, All Rights Reserved.
//
// Author: HonestQiao (honestqiao@hotmail.com/QQ:5601680)
//
// 程序简介:
// 本程序与RS232_Client构成一个完整的演示系统,展示了PHP在RS232串口通讯上的应用。
// 程序之中实现了一个基础但是完整的RS232通讯协议(HQB232),通讯协议格式如下:
// 协议内容:
// C->S 01 //请求通讯
// S->C 02 //响应通讯
// C->S LEN DATA //LEN表示数据(DATA)长度 DATA表示实际数据
// C->S 03 //结束通讯
// 说明:S表示上位机 C表示下位机
// HQB232表示HonestQiao演示的基础(Base)RS232通讯协议,包含了协议的
// 请求和响应,数据帧的结构。
// 演示过程为通讯的请求和响应,十次数据帧的发送, 通讯的结束
// 数据帧的结构为当前的序号,microtime(),随机字符串
//
// 欢迎探讨PHP在RS232串口通讯上的应用。
// --------------------------------------------------------------------------
set_time_limit(0);
exec('mode COM1: baud=9600 data=8 stop=1 parity=n xon=on');
$fd = dio_open('COM1:', O_RDWR);
if(!$fd)
{
die("Error when open COM1");
}
$ff = dio_stat($fd);print_r($ff);
echo "HQB232 SERVER is listenning on COM1\n";
/// read
$len = 2;
$t=0;while (($t++)<1000)
{
$data = dio_read($fd, $len);
if ($data) {
if($data==chr(0).chr(1)){
echo "S_RECV:01\n";
echo "S_SEND:02\n";
dio_write($fd,chr(0).chr(2));
break;
}
}
}
/// read
$len = 2;
$t=0;while (($t++)<1000)
{
$len = 2;
$data = dio_read($fd, $len);
if($data==chr(0).chr(3)){
echo "S_RECV:03\n";
break;
}
elseif ($data) {
$len = intval($data);
$data = dio_read($fd, $len);
if($data){
echo "S_RECV:($len)$data\n";
}
}
}
dio_close($fd);
?>
_____________________________________client端_______________________________
<?php
// --------------------------------------------------------------------------
// File name : RS232_Client.php
// Description : RS232演示下位机程序
// Requirement : PHP 5.1.4 (cli) (http://www.php.net)
//
// Copyright(C), HonestQiao, 2006, All Rights Reserved.
//
// Author: HonestQiao (honestqiao@hotmail.com/QQ:5601680)
//
// 程序简介:
// 本程序与RS232_Server构成一个完整的演示系统,展示了PHP在RS232串口通讯上的应用。
// 程序之中实现了一个基础但是完整的RS232通讯协议(HQB232),通讯协议格式如下:
// 协议内容:
// C->S 01 //请求通讯
// S->C 02 //响应通讯
// C->S LEN DATA //LEN表示数据(DATA)长度 DATA表示实际数据
// C->S 03 //结束通讯
// 说明:S表示上位机 C表示下位机
// HQB232表示HonestQiao演示的基础(Base)RS232通讯协议,包含了协议的
// 请求和响应,数据帧的结构。
// 演示过程为通讯的请求和响应,十次数据帧的发送, 通讯的结束
// 数据帧的结构为当前的序号,microtime(),随机字符串
//
// 欢迎探讨PHP在RS232串口通讯上的应用。
// --------------------------------------------------------------------------
set_time_limit(0);
//exec('mode COM1: baud=9600 data=8 stop=1 parity=n xon=on');
exec('mode COM1: baud=9600 data=8 stop=1 parity=n xon=on');
$fd = dio_open('COM1:', O_RDWR);
if(!$fd)
{
die("Error when open COM1");
}
$ff = dio_stat($fd);
echo "HQB232 CLIENT is start on COM1\n";
dio_write($fd,chr(0).chr(1));echo "C_SEND:01\n";
$len = 2;
$t=0;while(($t++)<1000)
{
$data = dio_read($fd, $len);
if($data==chr(0).chr(2)){
echo "C_RECV:02\n";
break;
}
}
$len = 2;
$t=0;while(($t++)<10)
{
$sdata = sprintf("%03d",$t) . "=" . microtime() . " (" . randomkeys(rand(0,35)) . ")";
$slen = strlen($sdata);
$stxlen = sprintf("%02d",$slen);
dio_write($fd,"$stxlen");
dio_write($fd,"$sdata");
echo "C_SEND:($stxlen)$sdata\n";
//sleep(1);
}
dio_write($fd,chr(0).chr(3));echo "C_SEND:03\n";
dio_close($fd);
function randomkeys($length)
{
$pattern = "1234567890abcdefghijklmnopqrstuvwxyz";
for($i=0;$i<$length;$i++)
{
$key .= $pattern{rand(0,35)};
}
return $key;
}
?>
// --------------------------------------------------------------------------
// File name : RS232_Client.php
// Description : RS232演示下位机程序
// Requirement : PHP 5.1.4 (cli) (http://www.php.net)
//
// Copyright(C), HonestQiao, 2006, All Rights Reserved.
//
// Author: HonestQiao (honestqiao@hotmail.com/QQ:5601680)
//
// 程序简介:
// 本程序与RS232_Server构成一个完整的演示系统,展示了PHP在RS232串口通讯上的应用。
// 程序之中实现了一个基础但是完整的RS232通讯协议(HQB232),通讯协议格式如下:
// 协议内容:
// C->S 01 //请求通讯
// S->C 02 //响应通讯
// C->S LEN DATA //LEN表示数据(DATA)长度 DATA表示实际数据
// C->S 03 //结束通讯
// 说明:S表示上位机 C表示下位机
// HQB232表示HonestQiao演示的基础(Base)RS232通讯协议,包含了协议的
// 请求和响应,数据帧的结构。
// 演示过程为通讯的请求和响应,十次数据帧的发送, 通讯的结束
// 数据帧的结构为当前的序号,microtime(),随机字符串
//
// 欢迎探讨PHP在RS232串口通讯上的应用。
// --------------------------------------------------------------------------
set_time_limit(0);
//exec('mode COM1: baud=9600 data=8 stop=1 parity=n xon=on');
exec('mode COM1: baud=9600 data=8 stop=1 parity=n xon=on');
$fd = dio_open('COM1:', O_RDWR);
if(!$fd)
{
die("Error when open COM1");
}
$ff = dio_stat($fd);
echo "HQB232 CLIENT is start on COM1\n";
dio_write($fd,chr(0).chr(1));echo "C_SEND:01\n";
$len = 2;
$t=0;while(($t++)<1000)
{
$data = dio_read($fd, $len);
if($data==chr(0).chr(2)){
echo "C_RECV:02\n";
break;
}
}
$len = 2;
$t=0;while(($t++)<10)
{
$sdata = sprintf("%03d",$t) . "=" . microtime() . " (" . randomkeys(rand(0,35)) . ")";
$slen = strlen($sdata);
$stxlen = sprintf("%02d",$slen);
dio_write($fd,"$stxlen");
dio_write($fd,"$sdata");
echo "C_SEND:($stxlen)$sdata\n";
//sleep(1);
}
dio_write($fd,chr(0).chr(3));echo "C_SEND:03\n";
dio_close($fd);
function randomkeys($length)
{
$pattern = "1234567890abcdefghijklmnopqrstuvwxyz";
for($i=0;$i<$length;$i++)
{
$key .= $pattern{rand(0,35)};
}
return $key;
}
?>
注意:在window下com是当作一个文件打开的,只能有一个进程控制,可能导致clien 或者 server 出现:Warning: dio_open(): cannot open file COM1: with flags 2 and permissions 0: Permission denied in ****
先前在玩GEC2410时,有个想法,就是在linux下进行调试,由于目标板上电或复位时会发送信息给PC机的串口,这已在windows下实现过,于是想在linux下看看效果,可是当时我在linux下设好串口后,发现一点反应都没有,当时以为是自己没有安装交叉编译环境,于是昨天晚上把嵌入式 linux下的交叉编译环境装好后,心想这下应该可以拉,没想到我上电目标板,linux下的串口一直没有反应,郁闷,怎么这样呢,既然不适交叉编译环境的原因,总得有个原因吧,于是我上网搜,先前我也够笨的,怎么就不知道上网查呢,呵呵,原来是我没有把VMware的串口打开,呵呵,马上关机[关虚拟机下的系统],在VM->Setting......->点击ADD,把串口加进来,呵呵设置时尽量不要用自动检测,要选中串口,反正即使你的虚拟系统启动后可以随便改的,同时要把串口设为启动时就连接拉,这样,linux下的串口在目标板上电或复位后收到和windows下一样的数据,哈哈,爽!
注意: 我是在windows下装的VMWARE,然后在VMWARE下装的Red Hat!
注意: 我是在windows下装的VMWARE,然后在VMWARE下装的Red Hat!
UPDATE:
UPDATE A SET ApproverID=NULL,ApproveDate=NULL,ApproveResult=100,CheckerID=null,CheckDate=null, IsCheck=0
FROM [SH_MaterialApplyBuyBill] A
LEFT JOIN [SH_MaterialApplyBuyBillDetail] B ON A.ID=B.[MaterialApplyBuyBillID]
WHERE A.id=125 AND @InDetailCount=0
DELETE:
DELETE A FROM [SH_ClosingBalance] A LEFT JOIN [SH_StoreHouse] B ON A.StoreHouseID=B.ID
WHERE B.departmentID='1000'
UPDATE A SET ApproverID=NULL,ApproveDate=NULL,ApproveResult=100,CheckerID=null,CheckDate=null, IsCheck=0
FROM [SH_MaterialApplyBuyBill] A
LEFT JOIN [SH_MaterialApplyBuyBillDetail] B ON A.ID=B.[MaterialApplyBuyBillID]
WHERE A.id=125 AND @InDetailCount=0
DELETE:
DELETE A FROM [SH_ClosingBalance] A LEFT JOIN [SH_StoreHouse] B ON A.StoreHouseID=B.ID
WHERE B.departmentID='1000'
如题:
前段时间程序中修改、删除sql时,涉及处理两个表。最近了解到,mysql可以直接联表操作:
联表修改:
update t1,t2 set t1.c1=* ,t2.c2=* where t1.c3=t2.c3 and t1.c2=*;
例如:修改纸条状态
update relation , information set relation.status = 2 where relation.infoid=information.infoid and information.group = 0 and relation.id in (125,126,127,128) and relation.owneruid = 1 and relation.type = 1
这样就可以直接修改符合条件的两个表的字段了。
联表删除:
delete t1,t2 from t1 left join t2 on t1.c3=t2.c3 where t1.c2=*;
例如:删除通知:
DELETE relation,
information FROM relation LEFT JOIN information ON relation.infoid = information.infoid WHERE information.group =0 AND relation.id IN ( 19 ,20,21 ) AND relation.owneruid =1
这样就可以一下删除两个表的相关记录了。
另外遍历整个数据表时,有一个比select更快的方法就是handler。大致用法如下:
handler 表名 open;
handler 表名 read next limit n;
handler 表名 close;
例如:遍历delinfoid表
mysql> handler delinfoid open;
mysql> handler delinfoid read next limit 10;
mysql> handler delinfoid read next limit 10;
mysql> handler delinfoid close;
在read时,如果不加limit的话,默认一次只读一条。
以上是使用这些方法的一些大致介绍,具体的大家可以查看手册 or google一下。
在IT企业中,作为一个技术工程师,今后的职业规划是怎样的?应该如何来应变越来越大的职业压力?技术工程师的将来在哪里?其实大家心里都清楚,技术工程师的将来有几条路:其一,技术管理,通过丰富的技术经验和不断成长的资历走向管理层;其二,资深技术顾问,在技术这条道上走到黑,成为某个技术领域的权威,成为资深的技术顾问;其三,是大家很容易忽略的,也是对于大多数技术工程师来说更能够实现的,被誉为二十一世纪最有前途的职业岗位:项目经理。
项目经理顾名思义是针对一个项目设定的leader,项目经理的职位是有时效性的,随着项目的产生而设置,随着项目的结束而终止,正因为有这样的属性,所以在一个集成公司里,项目经理的担当者就没有固定的人选,而对于大多数以项目而维系公司业务的集成公司来说,项目的成败就决定公司的成长消亡,而项目的成败又维系在最为关键的项目经理身上。
绝大多说的集成公司老总在有项目实施时,缺省会委派一个对项目所使用技术和产品熟悉的工程师担当项目经理。但一个工程师可以很快很好的胜任项目经理的职位吗?有好的技术就能做好项目管理吗?答案当然是否定的,那么,一个优秀的工程师如何转变为一个优秀的项目经理?在这个角色转变中,工程师应该注意哪些问题?应该有如何作为?
从我从事多年系统集成和信息安全行业的经历及对项目管理的经验出发,我对项目管理的角色有如下认识,不正确的地方,请各位专家指正:
阅读全文
项目经理顾名思义是针对一个项目设定的leader,项目经理的职位是有时效性的,随着项目的产生而设置,随着项目的结束而终止,正因为有这样的属性,所以在一个集成公司里,项目经理的担当者就没有固定的人选,而对于大多数以项目而维系公司业务的集成公司来说,项目的成败就决定公司的成长消亡,而项目的成败又维系在最为关键的项目经理身上。
绝大多说的集成公司老总在有项目实施时,缺省会委派一个对项目所使用技术和产品熟悉的工程师担当项目经理。但一个工程师可以很快很好的胜任项目经理的职位吗?有好的技术就能做好项目管理吗?答案当然是否定的,那么,一个优秀的工程师如何转变为一个优秀的项目经理?在这个角色转变中,工程师应该注意哪些问题?应该有如何作为?
从我从事多年系统集成和信息安全行业的经历及对项目管理的经验出发,我对项目管理的角色有如下认识,不正确的地方,请各位专家指正:

排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大,所以排序算法 对算法本身的速度要求很高。 而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。在后面我将 给出详细的说明。
对于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲。 我将按照算法的复杂度,从简单到难来分析算法。第一部分是简单排序算法,后面你将看到他们的共同点是算法复杂度为O(N*N)(因为没有使用word,所以无法打出上标和下标)。第二部分是高级排序算法,复杂度为O(Log2(N))。这里我们只介绍一种算法。另外还有几种 算法因为涉及树与堆的概念,所以这里不于讨论。第三部分类似动脑筋。这里的两种算法并不是最好的(甚至有最慢的),但是算法本身比较奇特,值得参考(编程的角度)。同时也可以让我们从另外的角度来认识这个问题。现在,让我们开始吧:
一、简单排序算法
由于程序比较简单,所以没有加什么注释。所有的程序都给出了完整的运行代码,并在我的VC环境
下运行通过。因为没有涉及MFC和WINDOWS的内容,所以在BORLAND C++的平台上应该也不会有什么
问题的。在代码的后面给出了运行过程示意,希望对理解有帮助。
1.冒泡法:
这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡:
#i nclude
void BubbleSort(int* pData,int Count)
{
int iTemp;
for(int i=1;i {
for(int j=Count-1;j>=i;j--)
{
if(pData[j] {
iTemp = pData[j-1];
pData[j-1] = pData[j];
pData[j] = iTemp;
}
}
}
}
void main()
{
int data[] = {10,9,8,7,6,5,4};
BubbleSort(data,7);
for (int i=0;i<7;i++)
cout< cout<<"\n";
}
倒序(最糟情况)
第一轮:10,9,8,7->10,9,7,8->10,7,9,8->7,10,9,8(交换3次)
第二轮:7,10,9,8->7,10,8,9->7,8,10,9(交换2次)
第一轮:7,8,10,9->7,8,9,10(交换1次)
循环次数:6次
交换次数:6次
其他:
第一轮:8,10,7,9->8,10,7,9->8,7,10,9->7,8,10,9(交换2次)
第二轮:7,8,10,9->7,8,10,9->7,8,10,9(交换0次)
第一轮:7,8,10,9->7,8,9,10(交换1次)
循环次数:6次
交换次数:3次
上面我们给出了程序段,现在我们分析它:这里,影响我们算法性能的主要部分是循环和交换,显然,次数越多,性能就越差。从上面的程序我们可以看出循环的次数是固定的,为1+2+...+n-1。 写成公式就是1/2*(n-1)*n。现在注意,我们给出O方法的定义:
若存在一常量K和起点n0,使当n>=n0时,有f(n)<=K*g(n),则f(n) = O(g(n))。(呵呵,不要说没 学好数学呀,对于编程数学是非常重要的!!!)
阅读全文
对于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲。 我将按照算法的复杂度,从简单到难来分析算法。第一部分是简单排序算法,后面你将看到他们的共同点是算法复杂度为O(N*N)(因为没有使用word,所以无法打出上标和下标)。第二部分是高级排序算法,复杂度为O(Log2(N))。这里我们只介绍一种算法。另外还有几种 算法因为涉及树与堆的概念,所以这里不于讨论。第三部分类似动脑筋。这里的两种算法并不是最好的(甚至有最慢的),但是算法本身比较奇特,值得参考(编程的角度)。同时也可以让我们从另外的角度来认识这个问题。现在,让我们开始吧:
一、简单排序算法
由于程序比较简单,所以没有加什么注释。所有的程序都给出了完整的运行代码,并在我的VC环境
下运行通过。因为没有涉及MFC和WINDOWS的内容,所以在BORLAND C++的平台上应该也不会有什么
问题的。在代码的后面给出了运行过程示意,希望对理解有帮助。
1.冒泡法:
这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡:
#i nclude
void BubbleSort(int* pData,int Count)
{
int iTemp;
for(int i=1;i
for(int j=Count-1;j>=i;j--)
{
if(pData[j]
iTemp = pData[j-1];
pData[j-1] = pData[j];
pData[j] = iTemp;
}
}
}
}
void main()
{
int data[] = {10,9,8,7,6,5,4};
BubbleSort(data,7);
for (int i=0;i<7;i++)
cout< cout<<"\n";
}
倒序(最糟情况)
第一轮:10,9,8,7->10,9,7,8->10,7,9,8->7,10,9,8(交换3次)
第二轮:7,10,9,8->7,10,8,9->7,8,10,9(交换2次)
第一轮:7,8,10,9->7,8,9,10(交换1次)
循环次数:6次
交换次数:6次
其他:
第一轮:8,10,7,9->8,10,7,9->8,7,10,9->7,8,10,9(交换2次)
第二轮:7,8,10,9->7,8,10,9->7,8,10,9(交换0次)
第一轮:7,8,10,9->7,8,9,10(交换1次)
循环次数:6次
交换次数:3次
上面我们给出了程序段,现在我们分析它:这里,影响我们算法性能的主要部分是循环和交换,显然,次数越多,性能就越差。从上面的程序我们可以看出循环的次数是固定的,为1+2+...+n-1。 写成公式就是1/2*(n-1)*n。现在注意,我们给出O方法的定义:
若存在一常量K和起点n0,使当n>=n0时,有f(n)<=K*g(n),则f(n) = O(g(n))。(呵呵,不要说没 学好数学呀,对于编程数学是非常重要的!!!)

4. static有什么用途?(请至少说明两种)
1.限制变量的作用域
2.设置变量的存储域
7. 引用与指针有什么区别?
1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
2) 不存在指向空值的引用,但是存在指向空值的指针。
8. 描述实时系统的基本特性
在特定时间内完成特定的任务,实时性与可靠性
9. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
全局变量储存在静态数据库,局部变量在堆栈
10. 什么是平衡二叉树?
左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1
11. 堆栈溢出一般是由什么原因导致的?
没有回收垃圾资源
12. 什么函数不能声明为虚函数?
constructor
13. 冒泡排序算法的时间复杂度是什么?
O(n^2)
14. 写出float x 与“零值”比较的if语句。
if(x>0.000001&&x<-0.000001)
16. Internet采用哪种网络协议?该协议的主要层次结构?
tcp/ip 应用层/传输层/网络层/数据链路层/物理层
17. Internet物理地址和IP地址转换采用什么协议?
ARP (Address Resolution Protocol)(地址解析协议)
18.IP地址的编码分为哪俩部分?
IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。
2.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。
循环链表,用取余操作做
3.不能做switch()的参数类型是:
switch的参数不能为实型。
华为
阅读全文
1.限制变量的作用域
2.设置变量的存储域
7. 引用与指针有什么区别?
1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
2) 不存在指向空值的引用,但是存在指向空值的指针。
8. 描述实时系统的基本特性
在特定时间内完成特定的任务,实时性与可靠性
9. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
全局变量储存在静态数据库,局部变量在堆栈
10. 什么是平衡二叉树?
左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1
11. 堆栈溢出一般是由什么原因导致的?
没有回收垃圾资源
12. 什么函数不能声明为虚函数?
constructor
13. 冒泡排序算法的时间复杂度是什么?
O(n^2)
14. 写出float x 与“零值”比较的if语句。
if(x>0.000001&&x<-0.000001)
16. Internet采用哪种网络协议?该协议的主要层次结构?
tcp/ip 应用层/传输层/网络层/数据链路层/物理层
17. Internet物理地址和IP地址转换采用什么协议?
ARP (Address Resolution Protocol)(地址解析协议)
18.IP地址的编码分为哪俩部分?
IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。
2.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。
循环链表,用取余操作做
3.不能做switch()的参数类型是:
switch的参数不能为实型。
华为

http://blog.chinaunix.net/u2/74524/showart_1137527.html
tftp服务的安装,对于RedHat9.0,tftp 的RPM包在安装光盘的第三张盘下,可以用mount /dev/cdrom mnt/cdrom 将其挂载后,拷贝到/home/work目录下
安装
rpm -ivh tftp-server-0.32********
rpm -ivh tftp-0.32*******(这个包是客户端登陆tftp服务器所需要的)
安装完后,进行配置及开启服务
在linux下,不管使用的是哪一种super-server,inetd或者xinetd,默认情况下TFTP服务是禁用的,所以要修改文件来开启服务。
切换到cd /etc目录下
打开tftp服务的配置文件
命令为emacs xinedt.d/tftp
修改后的文件如下:
对应的部分参数说明
修改项server_args= -s <path> -c,其中<path>处可以改为你的tftp-server的根目录,参数-s指定chroot,-c指定了可以创建文件
保存后退出
切换目录 cd /home/work
建立tftp的启动目录 tftpboot
mkdir tftpboot
然后重新开启tftp服务
命令为:service xinetd restart
这样,tftp-server就启动了。
你可以用查询命令看tftp服务是否开启
netstat -a | grep tftp
显示结果为
udp 0 0 *:tftp *:*
表明服务已经开启
你可以登陆本机测试以下,命令如下:
#tftp your-ip-address
tftp>get <download file>
tftp>put <upload file>
tftp>q
这样你就在linux下建立了tftp服务器,u-boot可以直接登录到你的主机上了,不用再切换到windows下用tftpd32.exe来建立服务器了。
安装
rpm -ivh tftp-server-0.32********
rpm -ivh tftp-0.32*******(这个包是客户端登陆tftp服务器所需要的)
安装完后,进行配置及开启服务
在linux下,不管使用的是哪一种super-server,inetd或者xinetd,默认情况下TFTP服务是禁用的,所以要修改文件来开启服务。
切换到cd /etc目录下
打开tftp服务的配置文件
命令为emacs xinedt.d/tftp
修改后的文件如下:
service tftp
{ socket_type =dgram
protocol =udp
wait =yes
user =root
server =/usr/sbin/in.tftpd
server_args =-s /home/work/tftpboot -c
disable =no
per_source =11
cps =100 2
flags =IPv4
}
{ socket_type =dgram
protocol =udp
wait =yes
user =root
server =/usr/sbin/in.tftpd
server_args =-s /home/work/tftpboot -c
disable =no
per_source =11
cps =100 2
flags =IPv4
}
对应的部分参数说明
修改项server_args= -s <path> -c,其中<path>处可以改为你的tftp-server的根目录,参数-s指定chroot,-c指定了可以创建文件
保存后退出
切换目录 cd /home/work
建立tftp的启动目录 tftpboot
mkdir tftpboot
然后重新开启tftp服务
命令为:service xinetd restart
这样,tftp-server就启动了。
你可以用查询命令看tftp服务是否开启
netstat -a | grep tftp
显示结果为
udp 0 0 *:tftp *:*
表明服务已经开启
你可以登陆本机测试以下,命令如下:
#tftp your-ip-address
tftp>get <download file>
tftp>put <upload file>
tftp>q
这样你就在linux下建立了tftp服务器,u-boot可以直接登录到你的主机上了,不用再切换到windows下用tftpd32.exe来建立服务器了。
对于一个人自身的存在,何者是有意义的,他自己并不知晓,并且,这一点肯定也不应该打扰其他人。一条鱼能对它终生畅游其中的水知道些什么?
苦难也罢,甜蜜也罢,都来自外界,而坚毅却来自内部,来自一个人自身的努力。在很大程序度上,我都是受我的本性的驱使去做事情。为此而获得太多的尊敬和热爱,让人感到羞愧。仇恨之箭也射向了我,但从未伤害我,因为它们从某种程度上属于另一个世界,而我与之没有多少关联。
我孤寂地生活着,年轻时痛苦万分,而在成熟之年却甘之如饴。
苦难也罢,甜蜜也罢,都来自外界,而坚毅却来自内部,来自一个人自身的努力。在很大程序度上,我都是受我的本性的驱使去做事情。为此而获得太多的尊敬和热爱,让人感到羞愧。仇恨之箭也射向了我,但从未伤害我,因为它们从某种程度上属于另一个世界,而我与之没有多少关联。
我孤寂地生活着,年轻时痛苦万分,而在成熟之年却甘之如饴。
第一题:两个运放,一个同相连的,一个反相连的,求输入与输出的关系,这个不难,一会就出来了,搞定10分;
第二题:好像是模电书上的一个,有关三极管饱和截止的,提出了输出电压与电流的要求,求两个电阻的取值;做是做了,但不知对不对,也没把握,10分
第三题:高频当中的,一个电阻与电容的串联将其等效为电阻与电容的并联,要求推导,不会;这个后来回来和同学说,他们还说是一个作业题,高频课基本上没听,这个就没戏了。
第四题:两个运放,有反馈,连接是一个的输入是另一个的输入,输出是另一个的输入,中间还有些电阻,求放大倍数与输入阻抗,不会做;
第五题:用555定时器搭建的多谐振荡器,充放电时间由555中的三极管的截止与饱和来控制时间不一样,第一问填很多空,5分;第二问画参考电压,图像3分,第三问要求求充放电时间了,也就是周期,三要素法记不住公式了,基本没戏了,12分,这问做不上;
第六题:用51单片机的P0口的三个端口来控制74HC595(移位寄存器)来控制一个数码管从0显示到9,要求肉眼能看清变化,数码管是共阴的。
这个没问题,搞定,不过刚开始写程序时,没有把数码管的0~9的码表写上去,后来交卷后发现忘了,就用了定义了一个空数组,留在那没写。
第七题:C语言的数据结构题,FIFO,前两问简单,第三问记不清了,但是也没去做了。
第二题:好像是模电书上的一个,有关三极管饱和截止的,提出了输出电压与电流的要求,求两个电阻的取值;做是做了,但不知对不对,也没把握,10分
第三题:高频当中的,一个电阻与电容的串联将其等效为电阻与电容的并联,要求推导,不会;这个后来回来和同学说,他们还说是一个作业题,高频课基本上没听,这个就没戏了。
第四题:两个运放,有反馈,连接是一个的输入是另一个的输入,输出是另一个的输入,中间还有些电阻,求放大倍数与输入阻抗,不会做;
第五题:用555定时器搭建的多谐振荡器,充放电时间由555中的三极管的截止与饱和来控制时间不一样,第一问填很多空,5分;第二问画参考电压,图像3分,第三问要求求充放电时间了,也就是周期,三要素法记不住公式了,基本没戏了,12分,这问做不上;
第六题:用51单片机的P0口的三个端口来控制74HC595(移位寄存器)来控制一个数码管从0显示到9,要求肉眼能看清变化,数码管是共阴的。
这个没问题,搞定,不过刚开始写程序时,没有把数码管的0~9的码表写上去,后来交卷后发现忘了,就用了定义了一个空数组,留在那没写。
第七题:C语言的数据结构题,FIFO,前两问简单,第三问记不清了,但是也没去做了。