PHPUnit mock一个对象实例及其代码!
| November 4, 2008 20:05 | root | Via 本站原创
文件:
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)));//必须是所谓的二维数组,否则出错
}
}
根据中科院最新研究结果.男人和女人在不同阶年龄段最爱的人!
| November 4, 2008 16:51 | root | Via 本站原创
听传说是中科院研究出鸡饲料,现在开始研究人了:
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岁的漂亮,有身段的女人.
结论:男人是专一的
仁者见仁,智者见智来源,觉得挺有意思。。。
| November 4, 2008 15:58 | root | Via 本站原创
〖解释〗仁者见它说是仁,智者见它说是智。比喻对同一个问题,不同的人从不同的立场或角度有不同的看法。
〖出处〗《周易·系辞上》:“仁者见之谓之仁,智者见之谓之智。”
〖示例〗俗话说:~,所以我们对这些人的看法应该理解。
【原文】
一阴一阳之谓道。继之者善也,成之者性也。仁者见之谓之仁,知者见之谓之知。百姓日用而不知,故君子之道鲜矣①。显诸仁,藏诸用,鼓万物而不与圣人同忧,盛德大业至矣哉!富有之谓大业。日新之谓盛德。生生之谓易②。成象之谓乾。效法之谓坤。极数知来之谓占③。通变之谓事。阴阳不测之谓神。
【注释】
①鲜:少,这里指很少有人了解。②日新:不断更新。生生:变化不止.③极数:穷尽卦、交的变化。
【译文】
阴阳的交替变化就叫做道。相继不断就是善,成就万物的是性。仁者从自己的角度看,把它叫做仁;智者从自己的角度看,把它叫做智。平民百姓每天接触阴阳之道而不懂得,因此君子之道就很少有人知道了。它表现出来就是仁,隐藏起来就是用,鼓动万物,不与圣人共同劳神忧虑,它的崇高品德和伟大业绩达到了顶点。拥有万物就叫伟大业绩。不断更新就叫崇高品德。变化不止就叫易。生成物象就叫乾。仿效乾而完成物象就叫坤。穷尽卦支而预知未来就叫占问。承接更新就叫事。阴阳交替不可把握就叫神奇。
【读解】
《系辞》的作者在这一节里阐发自己对“道”的看法,认为宇宙万物产生的根源在于“道”,即阴与阳的交替变化。道的变化是 无穷无尽的,道也无所不在,却难以把握,只有圣人君子才能完全领悟。
这些抽象的议论都在表达一种宇宙观,一种哲学思想,难怪晋通百姓不大搞得清楚。不过,如果不要说得那么高深,”百姓还是可以懂的。比如生命,来自于雌、雄的结合。比如花朵,生于阳光和土壤。比如时光,由白天和黑夜构成。这就是阴阳交替结合产生万物。
阴阳观具有中国特色,深入咱们心里,我们自古以来就用它看待和解释世界上的万事万物。
〖出处〗《周易·系辞上》:“仁者见之谓之仁,智者见之谓之智。”
〖示例〗俗话说:~,所以我们对这些人的看法应该理解。
【原文】
一阴一阳之谓道。继之者善也,成之者性也。仁者见之谓之仁,知者见之谓之知。百姓日用而不知,故君子之道鲜矣①。显诸仁,藏诸用,鼓万物而不与圣人同忧,盛德大业至矣哉!富有之谓大业。日新之谓盛德。生生之谓易②。成象之谓乾。效法之谓坤。极数知来之谓占③。通变之谓事。阴阳不测之谓神。
【注释】
①鲜:少,这里指很少有人了解。②日新:不断更新。生生:变化不止.③极数:穷尽卦、交的变化。
【译文】
阴阳的交替变化就叫做道。相继不断就是善,成就万物的是性。仁者从自己的角度看,把它叫做仁;智者从自己的角度看,把它叫做智。平民百姓每天接触阴阳之道而不懂得,因此君子之道就很少有人知道了。它表现出来就是仁,隐藏起来就是用,鼓动万物,不与圣人共同劳神忧虑,它的崇高品德和伟大业绩达到了顶点。拥有万物就叫伟大业绩。不断更新就叫崇高品德。变化不止就叫易。生成物象就叫乾。仿效乾而完成物象就叫坤。穷尽卦支而预知未来就叫占问。承接更新就叫事。阴阳交替不可把握就叫神奇。
【读解】
《系辞》的作者在这一节里阐发自己对“道”的看法,认为宇宙万物产生的根源在于“道”,即阴与阳的交替变化。道的变化是 无穷无尽的,道也无所不在,却难以把握,只有圣人君子才能完全领悟。
这些抽象的议论都在表达一种宇宙观,一种哲学思想,难怪晋通百姓不大搞得清楚。不过,如果不要说得那么高深,”百姓还是可以懂的。比如生命,来自于雌、雄的结合。比如花朵,生于阳光和土壤。比如时光,由白天和黑夜构成。这就是阴阳交替结合产生万物。
阴阳观具有中国特色,深入咱们心里,我们自古以来就用它看待和解释世界上的万事万物。
程序:
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();
};
}
C读写串口,编译通过,root运行OK
| November 3, 2008 15:43 | root | Via 本站原创
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);
}





