PHP开发,个人觉得还是要轻量级去做框架,分为3个层次:data 层 modle层 control 层,而我们在data层里面可能会用到设计模式的单一模式,而在modle层里面可能采用简单工厂模式,而在control层里面有order模式,和代理(proxy层,让框架去自动调用),而这里面往往这些都在一个依赖倒转原则下(也就是会修电脑但你不会修收音机),其实就是一个里氏代换原则,让data modle control彻底的分开,就像电脑插槽一样,随时随地可以替换,而且很容易查到问题 的所在。
工厂类调用方式:
$smarty = ClsFactory::Create ( "libs::MySmarty" );
$this->template = 'myrecord.html';
工厂类实现方法:
class ClsFactory
{
function Create($classname)
{
$c = explode("::",$classname);
if(count($c) == 2)
{
$package = $c[0];
$classname = $c[1];
}
if(!class_exists($classname))
{
$classpath = SERVER_ROOT."/libs/";
//if($package) $classpath .= $package."/";
$classfile = $classpath.strtolower($classname).".class.php";
if(!file_exists($classfile)) return 0;
include($classfile);
}
if(!class_exists($classname)) {
return 0;
}
return new $classname;
}
}
路径定义:
./stdafx.php:define ( "SERVER_ROOT", dirname ( __FILE__ ) );
全局变量:
function init_www()
{
$need_include = array (
SERVER_ROOT,
SERVER_ROOT . DIRECTORY_SEPARATOR . "libs" . DIRECTORY_SEPARATOR,
SERVER_ROOT . DIRECTORY_SEPARATOR . "program" . DIRECTORY_SEPARATOR,
dirname ( SERVER_ROOT ) . DIRECTORY_SEPARATOR . "libs" . DIRECTORY_SEPARATOR );
$include_path = explode ( PATH_SEPARATOR, ini_get ( 'include_path' ) );
foreach ( $need_include as $path )
{
if (! in_array ( $path, $include_path ))
{
$include_path [] = $path;
}
}
ini_set ( 'include_path', join ( PATH_SEPARATOR, $include_path ) );
}
init_www ();
工厂类调用方式:
$smarty = ClsFactory::Create ( "libs::MySmarty" );
$this->template = 'myrecord.html';
工厂类实现方法:
class ClsFactory
{
function Create($classname)
{
$c = explode("::",$classname);
if(count($c) == 2)
{
$package = $c[0];
$classname = $c[1];
}
if(!class_exists($classname))
{
$classpath = SERVER_ROOT."/libs/";
//if($package) $classpath .= $package."/";
$classfile = $classpath.strtolower($classname).".class.php";
if(!file_exists($classfile)) return 0;
include($classfile);
}
if(!class_exists($classname)) {
return 0;
}
return new $classname;
}
}
路径定义:
./stdafx.php:define ( "SERVER_ROOT", dirname ( __FILE__ ) );
全局变量:
function init_www()
{
$need_include = array (
SERVER_ROOT,
SERVER_ROOT . DIRECTORY_SEPARATOR . "libs" . DIRECTORY_SEPARATOR,
SERVER_ROOT . DIRECTORY_SEPARATOR . "program" . DIRECTORY_SEPARATOR,
dirname ( SERVER_ROOT ) . DIRECTORY_SEPARATOR . "libs" . DIRECTORY_SEPARATOR );
$include_path = explode ( PATH_SEPARATOR, ini_get ( 'include_path' ) );
foreach ( $need_include as $path )
{
if (! in_array ( $path, $include_path ))
{
$include_path [] = $path;
}
}
ini_set ( 'include_path', join ( PATH_SEPARATOR, $include_path ) );
}
init_www ();
背景:在Flash里直接在浏览器关闭时实现上报数据(Get;/Post;),发现有些浏览器不支持,调用Js实现也有这样的一个问题,记录在:
http://jackxiang.com/post/6084/
chrome浏览器支持onbeforeunload事件吗?
Chrome Safari 在调用 document.write、document.open、document.close 方法以及 "javascipt:" 伪协议时,不会触发 onbeforeunload 事件。
http://w3help.org/zh-cn/causes/BX2047
于是我就自己也试了一把这个Js调用Flash,Flash再调用Js的一个过程,记录如下:
这一篇文章是最好的实践方法,尤其是对Js调用Flash里的函数不同浏览器的不同方法:
http://www.imququ.com/post/39.html
再就是在使用FlashDevelop时新建时默认要用ActionScript AS3 Project,默认的AS3才行。
核心:http://www.imququ.com/post/39.html
结果,除了IE之外,其他浏览器都不会工作,会提示找不到hello这个方法。这个问题困扰了我比较久。最后发现:在非IE浏览器里,flash提供的方法是加在embed上的,我们要得到object下的embed对象,调用embed上的方法才会成功!
1)Html代码如下,index.html:
2)Flash的代码如下,Main.as:
阅读全文
http://jackxiang.com/post/6084/
chrome浏览器支持onbeforeunload事件吗?
Chrome Safari 在调用 document.write、document.open、document.close 方法以及 "javascipt:" 伪协议时,不会触发 onbeforeunload 事件。
http://w3help.org/zh-cn/causes/BX2047
于是我就自己也试了一把这个Js调用Flash,Flash再调用Js的一个过程,记录如下:
这一篇文章是最好的实践方法,尤其是对Js调用Flash里的函数不同浏览器的不同方法:
http://www.imququ.com/post/39.html
再就是在使用FlashDevelop时新建时默认要用ActionScript AS3 Project,默认的AS3才行。
核心:http://www.imququ.com/post/39.html
结果,除了IE之外,其他浏览器都不会工作,会提示找不到hello这个方法。这个问题困扰了我比较久。最后发现:在非IE浏览器里,flash提供的方法是加在embed上的,我们要得到object下的embed对象,调用embed上的方法才会成功!
1)Html代码如下,index.html:
2)Flash的代码如下,Main.as:

多选select 的name必须是一个name_value[],后面有这个中括号,为哈?
如果不是中括号的话,你用httpfox抓下包,
select 1
select 2
select 3
php他会得到一个值,也就是多选最下面的那个值,而在加上中括号后呢,就会出现如下:
select[] 1
select[] 2
select[] 3
select.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>提交多选的静态页</title>
</head>
<body>
<form id="post_form" name="post_form" method="post" action="./select.php">
<select name="select[]" size="10" multiple="multiple" id="select">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
<label> <br />
<input type="submit" name="button" id="button" value="提交" />
</label>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHP接收多选是一个数组</title>
</head>
select.php
<body>
<?php
print_r($_POST['select']);
?>
</body>
</html>
这样PHP得到:
Array
(
[0] => 1
[1] => 2
[2] => 3
)
如果不是中括号的话,你用httpfox抓下包,
select 1
select 2
select 3
php他会得到一个值,也就是多选最下面的那个值,而在加上中括号后呢,就会出现如下:
select[] 1
select[] 2
select[] 3
select.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>提交多选的静态页</title>
</head>
<body>
<form id="post_form" name="post_form" method="post" action="./select.php">
<select name="select[]" size="10" multiple="multiple" id="select">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
<label> <br />
<input type="submit" name="button" id="button" value="提交" />
</label>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHP接收多选是一个数组</title>
</head>
select.php
<body>
<?php
print_r($_POST['select']);
?>
</body>
</html>
这样PHP得到:
Array
(
[0] => 1
[1] => 2
[2] => 3
)
1. 自己技术很强很全面.
作为leader, 不一定要写很多代码, 但是下面人有了问题你要能解决. 这既是项目需要, 也是leader建立威信所必须的. 从lz的描述来看, 自己只参与了数据库相关的开发, 以至于小到搭环境出现问题大到改架构都需要X来处理, 而对于X没处理好的lz似乎很不满
2. 底下有个技术和关系都很过硬的人.
这个不用多说了, 只要这个技术牛人很服你, 你们沟通肯定没问题, 出现技术问题他自然可以帮你顶着. 有技术没关系, 别人没这个义务(如果只有你是leader的话). 没技术, 那啥也不用说了.
3. 团队技术过硬,关系融洽.
技术过硬问题就少, 关系融洽, 有问题就可以内部消化, 基本不会暴露到你跟前.
一、90%的困难你现在想都没有想到,你都不知道那是困难。
二、团队核心成员有人要提出辞职时,不要挽留,既然提出了,他迟早是要走的。
三、如果没有价格上的优势与技术上的绝对优势,千万不要进入红海市场,否则你会必输无疑!
四、做连锁经营业务,一定要做一套傻瓜版的营销手册与管理手册,只有这样,才能实现远距离的管理。
五、做成功一个店之后离你大的成功就不远了,所以你首先就是脚踏实地、集中精力地先做出一家,也是要放弃掉连锁的这种,不要在将来如何做连锁方面做太多的梦,先脚踏实地做出第一家。
阅读全文
二、团队核心成员有人要提出辞职时,不要挽留,既然提出了,他迟早是要走的。
三、如果没有价格上的优势与技术上的绝对优势,千万不要进入红海市场,否则你会必输无疑!
四、做连锁经营业务,一定要做一套傻瓜版的营销手册与管理手册,只有这样,才能实现远距离的管理。
五、做成功一个店之后离你大的成功就不远了,所以你首先就是脚踏实地、集中精力地先做出一家,也是要放弃掉连锁的这种,不要在将来如何做连锁方面做太多的梦,先脚踏实地做出第一家。

好的业务模式(产品) + 很好的技术 = 大赚钱
好的业务模式(产品) + 能用的技术 = 也赚钱
差的业务模式(产品) + 好的技术 = 赚吆喝(现在的SNS就差不多这样了)
差的业务模式(产品) + 差的技术 = 自己浪费资源
好的业务模式(产品) + 能用的技术 = 也赚钱
差的业务模式(产品) + 好的技术 = 赚吆喝(现在的SNS就差不多这样了)
差的业务模式(产品) + 差的技术 = 自己浪费资源
对我过去感兴趣的朋友们,请看十年总结系列文章
---
在经过RUP和XP两种思想的冲撞之后,我发现想要借助一个什么理论来获得工作绩效的提升,基本上是不可能的,
RUP也好,XP也罢,都不是看看书,照猫画虎就可以解决软件开发过程中的问题的。
阅读全文
---
在经过RUP和XP两种思想的冲撞之后,我发现想要借助一个什么理论来获得工作绩效的提升,基本上是不可能的,
RUP也好,XP也罢,都不是看看书,照猫画虎就可以解决软件开发过程中的问题的。

http://www.askwan.com/post/16/
1、安装: pkg_add -rv minicom
2、安装完成后,# rehash,然后运行# minicom 进行配置。配置和使用前最好查询一下minicom的man页,学习一下
它的键盘操作命令。注意,如果在/usr/local/etc/minicom/下没有etc目录,就要新建一个,用于保存配置文件。
3、进入minocom界面后,按Ctrl+A调出命令模式后,再按o命令,进入配置菜单。主要调整两样,一个是串口号,一个是波特率。
我的配置是:串口设置填/dev/cuad0,波特率部份填9600 8N1。
4、配置后,选择“Save setup as...”把它存为cisco。用X命令退出minicom。
5、用串行线连接电脑串口与交换机的控制口(Console)后,用# minicom 进入minicom即可!
2、安装完成后,# rehash,然后运行# minicom 进行配置。配置和使用前最好查询一下minicom的man页,学习一下
它的键盘操作命令。注意,如果在/usr/local/etc/minicom/下没有etc目录,就要新建一个,用于保存配置文件。
3、进入minocom界面后,按Ctrl+A调出命令模式后,再按o命令,进入配置菜单。主要调整两样,一个是串口号,一个是波特率。
我的配置是:串口设置填/dev/cuad0,波特率部份填9600 8N1。
4、配置后,选择“Save setup as...”把它存为cisco。用X命令退出minicom。
5、用串行线连接电脑串口与交换机的控制口(Console)后,用# minicom 进入minicom即可!
纸上得来终觉浅, 绝知此事要躬行,路慢慢其修远兮,吾将上下而求索,究天人之际,通古今之变,成一家之言!
一个人的性格,会成为他今后命运的指针 吗?
从前我太忙,忙着询问别人,反而忽略了最重要的事---回到自己身上找,因一个人的性格,会成为他今后命运的指针,建立自我,追求忘我。
一个人的性格,会成为他今后命运的指针 吗?
从前我太忙,忙着询问别人,反而忽略了最重要的事---回到自己身上找,因一个人的性格,会成为他今后命运的指针,建立自我,追求忘我。
今天日期
$today=date("Y-m-d");
昨天日期
$yesterday = date("Y-m-d", mktime(0, 0, 0,date("m"),date("d")-1,date("Y")));
本周开始日期(周一至周日算法)
$weekstart = date('Y-m-d',strtotime('last monday'));
本周结束日期(周一至周日算法)
$weekend = date("Y-m-d", mktime(0, 0, 0,date("m",strtotime($weekstart)),date("d",strtotime($weekstart))+6,date("Y",strtotime($weekstart))));
上周开始日期(周一至周日算法)
$pre_weekend = date('Y-m-d',strtotime('last sunday'));
上周结束日期(周一至周日算法)
$pre_weekstart = date("Y-m-d", mktime(0, 0, 0,date("m",strtotime($weekend)),date("d",strtotime($weekend))-6,date("Y",strtotime($weekend))));
$today=date("Y-m-d");
昨天日期
$yesterday = date("Y-m-d", mktime(0, 0, 0,date("m"),date("d")-1,date("Y")));
本周开始日期(周一至周日算法)
$weekstart = date('Y-m-d',strtotime('last monday'));
本周结束日期(周一至周日算法)
$weekend = date("Y-m-d", mktime(0, 0, 0,date("m",strtotime($weekstart)),date("d",strtotime($weekstart))+6,date("Y",strtotime($weekstart))));
上周开始日期(周一至周日算法)
$pre_weekend = date('Y-m-d',strtotime('last sunday'));
上周结束日期(周一至周日算法)
$pre_weekstart = date("Y-m-d", mktime(0, 0, 0,date("m",strtotime($weekend)),date("d",strtotime($weekend))-6,date("Y",strtotime($weekend))));
#include <stdio.h>
int a()
{ int b;
int a= 0x1e;
b = a+1;
return b;
printf("%d",b);
}
int main()
{
int dd;
dd = a();
printf("%d",dd);
}
int a()
{ int b;
int a= 0x1e;
b = a+1;
return b;
printf("%d",b);
}
int main()
{
int dd;
dd = a();
printf("%d",dd);
}
富家子弟等于温室长大的植物,无论是大树或是什么植物,根部一定不壮,若再放纵他一点,将来他一生辛苦,遇到什么打击,面对逆境他便无法应付,我虽然不是很本事,但我可以说,我这颗小树,是在风雨中,从沙石中长大的。你可以到山上试一试,要拔起从沙石缝中长出来的小植物,是相当费劲。
当然你对i的工作有兴趣,当然你可以做得很好。
香港公司的人要找我,外国公司的人也要找我,我两方面都要照顾,都是这样应付,习惯了,也明白到身处这个职位便要有这种负担!
当然你对i的工作有兴趣,当然你可以做得很好。
香港公司的人要找我,外国公司的人也要找我,我两方面都要照顾,都是这样应付,习惯了,也明白到身处这个职位便要有这种负担!
1、“这第一碗酒,朕要敬给太皇太后孝庄,敬给列祖列宗的在天之灵。朕八岁丧父,九岁丧母,是孝庄太后带着朕,冲破千难险阻,才有今天的大清盛世!孝庄太后,朕想你啊。
还有这第二碗酒,朕要敬给列位臣工,敬给天下子民,敬给今天赴宴的老同年们!六十年来,是你们辅佐朕,保国平安,你们俯首农桑,致使大清的百业兴旺。君、臣、民,三者同德呀,啊!没有你们,记着便没有今日的大清。朕在这儿谢谢你们了。
这第三碗酒啊,朕要敬给朕的死敌们。鳌拜,吴三桂,嘿!郑经,噶尔丹,噢,还有那个朱三太子,啊?嘿,他们都是英雄豪杰呀,啊,他们造就了朕那!他们逼着朕立下了这丰功伟业。朕恨他们,也敬他们。哎,可惜呀,他们都死了,朕寂寞啊!......朕不祝他们死的安宁,祝他们,来生再世再与朕为敌吧!”
阅读全文
还有这第二碗酒,朕要敬给列位臣工,敬给天下子民,敬给今天赴宴的老同年们!六十年来,是你们辅佐朕,保国平安,你们俯首农桑,致使大清的百业兴旺。君、臣、民,三者同德呀,啊!没有你们,记着便没有今日的大清。朕在这儿谢谢你们了。
这第三碗酒啊,朕要敬给朕的死敌们。鳌拜,吴三桂,嘿!郑经,噶尔丹,噢,还有那个朱三太子,啊?嘿,他们都是英雄豪杰呀,啊,他们造就了朕那!他们逼着朕立下了这丰功伟业。朕恨他们,也敬他们。哎,可惜呀,他们都死了,朕寂寞啊!......朕不祝他们死的安宁,祝他们,来生再世再与朕为敌吧!”

串口编程
查询硬件的方式:查询方式、中断方式、DMA方式。串口很多是使用中断方式,这种方式一般来讲对CPU比较有效。
UART的操作主要包括以下几个部分:
数据发送;数据接受;产生中断;产生波特率;Loopback模式;红外模式;自动流控模式;
串口参数的配置主要包括:波特率、数据位、停止位、流控协议。
在linux下操作串口与操作文件相同。
在使用串口之前必须设置相关配置,包括:波特率、数据位、校验位、停止位等。串口设置由下面结构体实现。
Struct termios{
tcflag_t c_iflag; /* input flags */
tcflag_t c_oflag; /* output flags */
tcflag_t c_cflag; /* control flags */
tcflag_t c_lflag; /* local flags */
cc_t c_cc[NCCS]; /* control character */
};
串口配置流程
1、保存原先串口配置,使用tcgetattr(fd,&oldtio)函数
struct termios newtio,oldtio;
tcgetattr(fd,&oldtio);
2、激活选项,有CLOCAL 和CREAD,用于本地连接和接收使能。
newtio.c_cflag |= CLOCAL | CREAD
3、设置波特率,使用函数cfsetispeed、cfsetospeed。
cfsetipeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
4、设置数据位,需要使用掩码设置。
newtio.c_cflag &= ~CSIZE;
newtio.c_cflag |= CS8;
5、设置奇偶校验位,使用c_cflag和c_iflag。
设置奇校验:
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);
设置欧校验:
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
6、设置停止位,通过激活c_cflag中的CSTOPB实现。若停止位为1,则清楚CSTOPB,若停止位为2,则 激活CSTOPB。
newtio.c_cflag &= ~CSTOPB;
7、设置最少字符和等待时间,对于接受字符和等待时间没有特别要求时,可设为0。
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
8、处理要写入的引用对象
tcflush函数刷清(抛弃)输入缓存(终端驱动程序已接收到,但用户程序尚未读)
或输出缓存(用户程序已写,但尚未发送)。
int tcflush(int filedes, int queue)
queue数应当是下列三个常数之一:
TCIFLUSH 刷清输入队列。
TCOFLUSH 刷清输出队列。
TCIOFLUSH 刷清输入、输出队列。
9、激活配置。在完成配置后,需激活配置使其生效。
使用tsettattr()函数。原型:
int tcgetattr(int filedes, struct termios *termptr);
int tcgetattr(int filedes, int opt, const struct termios * termptr);
tcsetattr的参数opt使我们可以指定在什么时候新的终端属性才起作用。opt可以指定wei下列常数中的一 个:
TCSANOW 更改立即发生。
TCSADRAIN 发送了所有输出后更改才发生。若更改输出参数则应使用此选择项。
TCSAFLUSH 发送了所有输出后更改才发生。更进一步,在更改发生时未读的宋有输入数据都被删除(刷清)
使用如:tcsetattr(fd, TCSANOW, &newtio)
打开串口
f d = open("/dev/ttyS0", O_RDWR|O_NOCTTY|O_NDELAY);
open函数中除普通参数外,另有两个参数O_NOCTTY和O_NDELAY。
O_NOCTTY:通知linux系统,这个程序不会成为这个端口的控制终端。
O_NDELAY:通知linux系统不关心DCD信号线所处的状态(端口的另一端是否激活或者停止)
然后,恢复串口的状态为阻塞状态,用于等待串口数据的读入。用fcntl函数:
fcntl(fd, F_SETFEL, 0);
接着, 测试打开的文件描述符是否引用一个终端设备,以进一步确认串口是否正确打开.
isatty(STDIN_FILENO);
串口读写
串口的读写与普通文件的读写是一样的,使用read,write函数。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhanghuiliang/archive/2008/05/21/2467040.aspx
查询硬件的方式:查询方式、中断方式、DMA方式。串口很多是使用中断方式,这种方式一般来讲对CPU比较有效。
UART的操作主要包括以下几个部分:
数据发送;数据接受;产生中断;产生波特率;Loopback模式;红外模式;自动流控模式;
串口参数的配置主要包括:波特率、数据位、停止位、流控协议。
在linux下操作串口与操作文件相同。
在使用串口之前必须设置相关配置,包括:波特率、数据位、校验位、停止位等。串口设置由下面结构体实现。
Struct termios{
tcflag_t c_iflag; /* input flags */
tcflag_t c_oflag; /* output flags */
tcflag_t c_cflag; /* control flags */
tcflag_t c_lflag; /* local flags */
cc_t c_cc[NCCS]; /* control character */
};
串口配置流程
1、保存原先串口配置,使用tcgetattr(fd,&oldtio)函数
struct termios newtio,oldtio;
tcgetattr(fd,&oldtio);
2、激活选项,有CLOCAL 和CREAD,用于本地连接和接收使能。
newtio.c_cflag |= CLOCAL | CREAD
3、设置波特率,使用函数cfsetispeed、cfsetospeed。
cfsetipeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
4、设置数据位,需要使用掩码设置。
newtio.c_cflag &= ~CSIZE;
newtio.c_cflag |= CS8;
5、设置奇偶校验位,使用c_cflag和c_iflag。
设置奇校验:
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);
设置欧校验:
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
6、设置停止位,通过激活c_cflag中的CSTOPB实现。若停止位为1,则清楚CSTOPB,若停止位为2,则 激活CSTOPB。
newtio.c_cflag &= ~CSTOPB;
7、设置最少字符和等待时间,对于接受字符和等待时间没有特别要求时,可设为0。
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
8、处理要写入的引用对象
tcflush函数刷清(抛弃)输入缓存(终端驱动程序已接收到,但用户程序尚未读)
或输出缓存(用户程序已写,但尚未发送)。
int tcflush(int filedes, int queue)
queue数应当是下列三个常数之一:
TCIFLUSH 刷清输入队列。
TCOFLUSH 刷清输出队列。
TCIOFLUSH 刷清输入、输出队列。
9、激活配置。在完成配置后,需激活配置使其生效。
使用tsettattr()函数。原型:
int tcgetattr(int filedes, struct termios *termptr);
int tcgetattr(int filedes, int opt, const struct termios * termptr);
tcsetattr的参数opt使我们可以指定在什么时候新的终端属性才起作用。opt可以指定wei下列常数中的一 个:
TCSANOW 更改立即发生。
TCSADRAIN 发送了所有输出后更改才发生。若更改输出参数则应使用此选择项。
TCSAFLUSH 发送了所有输出后更改才发生。更进一步,在更改发生时未读的宋有输入数据都被删除(刷清)
使用如:tcsetattr(fd, TCSANOW, &newtio)
打开串口
f d = open("/dev/ttyS0", O_RDWR|O_NOCTTY|O_NDELAY);
open函数中除普通参数外,另有两个参数O_NOCTTY和O_NDELAY。
O_NOCTTY:通知linux系统,这个程序不会成为这个端口的控制终端。
O_NDELAY:通知linux系统不关心DCD信号线所处的状态(端口的另一端是否激活或者停止)
然后,恢复串口的状态为阻塞状态,用于等待串口数据的读入。用fcntl函数:
fcntl(fd, F_SETFEL, 0);
接着, 测试打开的文件描述符是否引用一个终端设备,以进一步确认串口是否正确打开.
isatty(STDIN_FILENO);
串口读写
串口的读写与普通文件的读写是一样的,使用read,write函数。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhanghuiliang/archive/2008/05/21/2467040.aspx
function escape_array($ar)
{
if (is_array ( $ar ))
{
foreach ( $ar as $key => $ar_sub )
{
$ar [$key] = $this->escape_array ( $ar_sub );
}
}
else if (is_string ( $ar ))
{
$ar = @mysql_escape_string ( $ar );
}
return $ar;
}
1.
条件: magic_quotes_gpc=off
写入数据库的字符串未经过任何过滤处理。从数据库读出的字符串也未作任何处理。
数据: $data="snow''''sun" ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:"snow''''sun" 写入数据库,
结果: 出现sql语句错误,mysql不能顺利完成sql语句,写入数据库失败。
数据库保存格式:无数据。
输出数据格式:无数据。
说明: 对于未经处理的单引号在写入数据库时会使sql语句发生错误。
2.
条件: magic_quotes_gpc=off
写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。
数据: $data="snow''''sun" ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:"snow''''sun" 写入数据库,
结果: sql语句顺利执行,数据成功写入数据库
数据库保存格式:snow''''sun (和输入一样)
输出数据格式:snow''''sun (和输入一样)
说明: addslashes()函数将单引号转换为'的转义字符使sql语句成功执行,
但\'并未作为数据存入数据库,数据库保存的是snow'''sun 而并不是我们想象的snowsun
3.
条件: magic_quotes_gpc=on
写入数据库的字符串未经过任何处理。从数据库读出的字符串未作任何处理。
数据: $data="snow''''sun" ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:"snow''''sun" 写入数据库,
结果: sql语句顺利执行,数据成功写入数据库
数据库保存格式:snow''''sun (和输入一样)
输出数据格式:snow''''sun (和输入一样)
说明: magic_quotes_gpc=on 将单引号转换为'的转义字符使sql语句成功执行,
但\'并未作为数据入数据库,数据库保存的是snow'''sun而并不是我们想象的snowsun。
4.
条件: magic_quotes_gpc=on
写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。
数据: $data="snow''''sun" ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:"snow''''sun" 写入数据库,
结果: sql语句顺利执行,数据成功写入数据库
数据库保存格式:snowsun (添加了转义字符)
输出数据格式:snowsun (添加了转义字符)
说明: magic_quotes_gpc=on 将单引号转换为的转义字符使sql语句成功执行,
addslashes又将即将写入数据库的单引号转换为,后者的转换被作为数据写入
数据库,数据库保存的是snowsun
总结如下:
1. 对于magic_quotes_gpc=on的情况,
我们可以不对输入和输出数据库的字符串数据作
addslashes()和stripslashes()的操作,数据也会正常显示。
如果此时你对输入的数据作了addslashes()处理,
那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。
2. 对于magic_quotes_gpc=off 的情况
必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出
因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。
补充:
magic_quotes_gpc 作用范围是:WEB客户服务端;作用时间:请求开始时,例如当脚本运行时.
magic_quotes_runtime 作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;作用时间:每次当脚本访问运行状态中产生的数据
条件: magic_quotes_gpc=off
写入数据库的字符串未经过任何过滤处理。从数据库读出的字符串也未作任何处理。
数据: $data="snow''''sun" ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:"snow''''sun" 写入数据库,
结果: 出现sql语句错误,mysql不能顺利完成sql语句,写入数据库失败。
数据库保存格式:无数据。
输出数据格式:无数据。
说明: 对于未经处理的单引号在写入数据库时会使sql语句发生错误。
2.
条件: magic_quotes_gpc=off
写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。
数据: $data="snow''''sun" ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:"snow''''sun" 写入数据库,
结果: sql语句顺利执行,数据成功写入数据库
数据库保存格式:snow''''sun (和输入一样)
输出数据格式:snow''''sun (和输入一样)
说明: addslashes()函数将单引号转换为'的转义字符使sql语句成功执行,
但\'并未作为数据存入数据库,数据库保存的是snow'''sun 而并不是我们想象的snowsun
3.
条件: magic_quotes_gpc=on
写入数据库的字符串未经过任何处理。从数据库读出的字符串未作任何处理。
数据: $data="snow''''sun" ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:"snow''''sun" 写入数据库,
结果: sql语句顺利执行,数据成功写入数据库
数据库保存格式:snow''''sun (和输入一样)
输出数据格式:snow''''sun (和输入一样)
说明: magic_quotes_gpc=on 将单引号转换为'的转义字符使sql语句成功执行,
但\'并未作为数据入数据库,数据库保存的是snow'''sun而并不是我们想象的snowsun。
4.
条件: magic_quotes_gpc=on
写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。
数据: $data="snow''''sun" ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:"snow''''sun" 写入数据库,
结果: sql语句顺利执行,数据成功写入数据库
数据库保存格式:snowsun (添加了转义字符)
输出数据格式:snowsun (添加了转义字符)
说明: magic_quotes_gpc=on 将单引号转换为的转义字符使sql语句成功执行,
addslashes又将即将写入数据库的单引号转换为,后者的转换被作为数据写入
数据库,数据库保存的是snowsun
总结如下:
1. 对于magic_quotes_gpc=on的情况,
我们可以不对输入和输出数据库的字符串数据作
addslashes()和stripslashes()的操作,数据也会正常显示。
如果此时你对输入的数据作了addslashes()处理,
那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。
2. 对于magic_quotes_gpc=off 的情况
必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出
因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。
补充:
magic_quotes_gpc 作用范围是:WEB客户服务端;作用时间:请求开始时,例如当脚本运行时.
magic_quotes_runtime 作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;作用时间:每次当脚本访问运行状态中产生的数据